c# - 如何在控制器动作的单元测试中传递特定的 UserContext
问题描述
我有以下控制器动作
[Route(ActionName.Create)]
public async Task<ActionResult> Create()
{
....
if (!UserContext.Roles.HasFlag(GroupsEnum.Admin))
{
throw new UnauthorizedAccessException("Permission Denied");
}
...
}
我在 xxxxControllerTests.cs 中有以下内容
[TestMethod]
public async Task Can_Request_Create()
{
ViewResult result = (ViewResult)await MockController.Object.Create();
...
...
}
当我运行单元测试时,会引发未经授权的访问异常。如何在 mockController 时传递 UserContext,从而使用特定的用户上下文执行控制器操作?
解决方案
通常,当您实例化您正在测试的控制器时,您可以像这样初始化它:
var controllerToTest = new MyController() {
ControllerContext = new ControllerContext {
HttpContext = //assign mock context,
UserContext = //assign mock context
}
};
var result = controllerToTest.Create();
然而,这行代码让我觉得你正在测试一个已经模拟的控制器:
ViewResult result = (ViewResult)await MockController.Object.Create();
这个.Object
电话让我觉得你有一个Mock<MyController>
在那里,这是不对的。你不是在测试你自己的控制器。
推荐阅读
- javascript - Fullpage.js onSlideLeave 触发 CSS 类
- ionic-framework - 参数类型“{directives: any[];}”不可分配给“NgModule”类型的参数
- python - 使用图像运行 PyQt5 时出错
- java - Solr 插件自定义
- python - 阶跃函数和指数衰减的卷积
- javascript - 打开不同选项卡中的 URL 列表并单击相同按钮
- android - [Android]如何使用 ADB 命令将正在进行的通话置于 HOLD
- javascript - Summernote 编辑器 - 将转发器字段添加到对话框
- c++ - 如何在 Cmake 中正确设置标题路径以在我的项目中构建 Box2D
- php - php mkdir() 无法正常工作