在控制器中模拟用户

时间:2013-12-02 17:34:31

标签: asp.net-mvc mocking moq

我正在使用Moq来确定用户是否具有某个角色。我在默认的MVC项目(How to mock Controller.User using moq)中尝试了以下示例,但是在运行测试时出现以下错误。

  

模拟上的预期调用至少一次,但从来没有   执行:p => p.IsInRole( “管理员”)

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

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

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

        var controllerContextMock = new Mock<ControllerContext>();
        controllerContextMock.SetupGet(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");
    }

看起来肯定会调用IsInRole(“admin”),所以我不确定为什么我会收到此错误。

1 个答案:

答案 0 :(得分:1)

你永远不会打电话

userMock.Object.IsInRole("admin")

您正在设置

userMock.Object.IsInRole("admin") == true

并且您正在尝试验证是否以这种方式调用它,但是对Verify的调用失败,因为您从未手动调用IsInRole("admin"),而Index方法也没有HomeController