はMOQ

2009-04-16 7 views
40

を使用してController.Userを模擬するためにどのように私はその条件に便利働くこのはMOQ

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

のような役割のためにController.Userを照会ActionMethodsのカップルを持っています。

私はこの

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

    Assert.IsNotNull(index); 
} 

とController.Userが設定されていないため、テストが失敗したようなコードを使用して、これらのメソッドのテストを行うために始めています。

答えて

65

コントローラのユーザープロパティをモックするには、ControllerContext、HttpContextBase、そして最後にIPrincipalをモックする必要があります。 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"); 
    } 

テストユーザーが管理者でない振る舞いはfalseを返すようにuserMockオブジェクトに設定期待を変えるのと同じくらい簡単です。部品番号のバージョン3.1(およびNUnitの)を使用して

+8

最新のMoqでは、ExpectGetがSetupGetに置き換えられました。 – Slider345

+0

コントローラのコンストラクタでClaimsPrincipalを使用している場合、これを行う方法はありますか? – russelrillema

20

:テストを設定する際のHttpContextのためのモックを作成する必要がないことを

[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'"); 
    } 

お知らせ、部品番号は、プロパティのネストをサポートしています。