Come deridere Controller.User usando moq

Ho un paio di ActionMethods che interrogano Controller.User per il suo ruolo come questo

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

agendo convenientemente su questa condizione.

Sto iniziando a fare test per questi metodi con codice come questo

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

e che Test non riesce perché Controller.User non è impostato. Qualche idea?

Devi prendere in giro ControllerContext, HttpContextBase e infine IPrincipal per deridere la proprietà utente su Controller. Utilizzando Moq (v2) qualcosa dovrebbe funzionare come segue.

  [TestMethod] public void HomeControllerReturnsIndexViewWhenUserIsAdmin() { var homeController = new HomeController(); var userMock = new Mock(); userMock.Expect(p => p.IsInRole("admin")).Returns(true); var contextMock = new Mock(); contextMock.ExpectGet(ctx => ctx.User) .Returns(userMock.Object); var controllerContextMock = new Mock(); 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"); } 

Verificare il comportamento quando l’utente non è un amministratore è semplice come modificare il set di aspettative sull’object userMock per restituire false.

Utilizzando Moq versione 3.1 (e NUnit):

  [Test] public void HomeController_Index_Should_Return_Non_Null_ViewPage() { // Assign: var homeController = new HomeController(); Mock controllerContextMock = new Mock(); controllerContextMock.Setup( x => x.HttpContext.User.IsInRole(It.Is(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(s => s.Equals("admin"))), Times.Exactly(1), "Must check if user is in role 'admin'"); } 

Si noti che non è necessario creare simulazioni per HttpContext, Moq supporta l’annidamento delle proprietà durante l’impostazione del test.