c# - 如何使用最小起订量模拟 Controller.User

标签 c# asp.net-mvc unit-testing mocking moq

我有几个 ActionMethods 可以像这样查询 Controller.User 的角色

bool isAdmin = User.IsInRole("admin");

在那个条件下方便地行动。

我开始用这样的代码对这些方法进行测试

[TestMethod]
public void HomeController_Index_Should_Return_Non_Null_ViewPage()
{
    HomeController controller  = new HomePostController();
    ActionResult index = controller.Index();

    Assert.IsNotNull(index);
}

并且该测试失败,因为未设置 Controller.User。 有什么想法吗?

最佳答案

您需要模拟 ControllerContext、HttpContextBase 和最后的 IPrincipal 来模拟 Controller 上的用户属性。使用 Moq (v2) 以下行的内容应该可以工作。

    [TestMethod]
    public void HomeControllerReturnsIndexViewWhenUserIsAdmin() {
        var homeController = new HomeController();

        var userMock = new Mock<IPrincipal>();
        userMock.Expect(p => p.IsInRole("admin")).Returns(true);

        var contextMock = new Mock<HttpContextBase>();
        contextMock.ExpectGet(ctx => ctx.User)
                   .Returns(userMock.Object);

        var controllerContextMock = new Mock<ControllerContext>();
        controllerContextMock.ExpectGet(con => con.HttpContext)
                             .Returns(contextMock.Object);

        homeController.ControllerContext = controllerContextMock.Object;
        var result = homeController.Index();
        userMock.Verify(p => p.IsInRole("admin"));
        Assert.AreEqual(((ViewResult)result).ViewName, "Index");
    }

当用户不是管理员时测试行为就像更改 userMock 对象上设置的期望以返回 false 一样简单。

关于c# - 如何使用最小起订量模拟 Controller.User,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758066/

相关文章:

c# - WPF从数据网格中获取数据的东西存储过程

c# - 显示xml特殊字符

javascript - 输入超过最大宽度时动态扩展文本区域的高度

C#、Linq2SQL - 获取具有关系数据的 ViewModel 对象的技巧?

Python:编写单元测试失败了

c# - 单元测试后面的 "intent"- 我应该瞄准什么?

javascript - 使用 PhantomJS 进行单元测试时如何防止 img src 404 错误

c# - 如何连接 TFS 并获取特定用户的项目列表

C# - 使用子类实现接口(interface)

asp.net-mvc - 如何使用 Entity Framework 5 在测试和生产数据库之间切换