51

このような役割について Controller.User に問い合わせる ActionMethods がいくつかあります。

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 が設定されていないため、そのテストは失敗します。何か案が?

4

3 に答える 3

75

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 を返すようにするだけです。

于 2009-04-16T21:51:00.507 に答える
25

Moq バージョン 3.1 (および NUnit) の使用:

    [Test]
    public void HomeController_Index_Should_Return_Non_Null_ViewPage()
    {
        // Assign:
        var homeController = new HomeController();

        Mock<ControllerContext> controllerContextMock = new Mock<ControllerContext>();
        controllerContextMock.Setup(
            x => x.HttpContext.User.IsInRole(It.Is<string>(s => s.Equals("admin")))
            ).Returns(true);
        homeController.ControllerContext = controllerContextMock.Object;

        // Act:
        ActionResult index = homeController.Index();

        // Assert:
        Assert.IsNotNull(index);
        // Place other asserts here...
        controllerContextMock.Verify(
            x => x.HttpContext.User.IsInRole(It.Is<string>(s => s.Equals("admin"))),
            Times.Exactly(1),
            "Must check if user is in role 'admin'");
    }

HttpContext のモックを作成する必要がないことに注意してください。Moq は、テストのセットアップ時にプロパティのネストをサポートしています。

于 2011-07-04T11:10:28.237 に答える