首页 > 解决方案 > 如何在控制器动作的单元测试中传递特定的 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,从而使用特定的用户上下文执行控制器操作?

标签: c#unit-testing

解决方案


通常,当您实例化您正在测试的控制器时,您可以像这样初始化它:

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>在那里,这是不对的。你不是在测试你自己的控制器。


推荐阅读