2009-04-16 2 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 객체에 설정된 기대 변화만큼 간단하다. MOQ 버전 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'"); 
    } 

공지 사항 즉, MOQ 속성의 중첩을 지원합니다.