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

2024-04-29

我有几个 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 一样简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用最小起订量模拟 Controller.User 的相关文章

随机推荐