2

Essayer de comprendre comment tester adéquatement mon contrôleur de comptes. J'ai un problème pour tester le scénario d'ouverture de session réussie.Comment écrire un test pour le contrôleur de comptes pour les formulaires d'authentification

numéro 1) Suis-je manque d'autres tests. (Je teste les attributs de validation de modèle séparément)

numéro 2) Put_ReturnsOverviewRedirectToRouteResultIfLogonSuccessAndNoReturnUrlGiven() et le test Put_ReturnsRedirectResultIfLogonSuccessAndReturnUrlGiven() ne passent pas. Je l'ai réduit à la ligne où j'appelle _membership.validateuser(). Même si lors de ma configuration fictive du service, je déclare que je veux retourner vrai chaque fois que validateuser est appelé, l'appel de méthode renvoie false.

Voici ce que j'ai obtenu jusqu'à présent

AccountController.cs

[HandleError] 
public class AccountController : Controller 
{ 
    private IMembershipService _membershipService; 

    public AccountController() 
     : this(null) 
    { 
    } 

    public AccountController(IMembershipService membershipService) 
    { 
     _membershipService = membershipService ?? new AccountMembershipService(); 
    } 

    [HttpGet] 
    public ActionResult LogOn() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (_membershipService.ValidateUser(model.UserName,model.Password)) 
      { 
       if (!String.IsNullOrEmpty(returnUrl)) 
       { 
        return Redirect(returnUrl); 
       } 
       return RedirectToAction("Index", "Overview"); 
      } 
      ModelState.AddModelError("*", "The user name or password provided is incorrect."); 
     } 

     return View(model); 
    } 

} 

AccountServices.cs

public interface IMembershipService 
{ 
    bool ValidateUser(string userName, string password); 
} 

public class AccountMembershipService : IMembershipService 
{ 
    public bool ValidateUser(string userName, string password) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

AccountControllerFacts.cs

public class AccountControllerFacts 
{ 
    public static AccountController GetAccountControllerForLogonSuccess() 
    { 
     var membershipServiceStub = MockRepository.GenerateStub<IMembershipService>(); 
     var controller = new AccountController(membershipServiceStub); 
     membershipServiceStub 
       .Stub(x => x.ValidateUser("someuser", "somepass")) 
       .Return(true); 
     return controller; 
    } 

    public static AccountController GetAccountControllerForLogonFailure() 
    { 
     var membershipServiceStub = MockRepository.GenerateStub<IMembershipService>(); 
     var controller = new AccountController(membershipServiceStub); 
     membershipServiceStub 
       .Stub(x => x.ValidateUser("someuser", "somepass")) 
       .Return(false); 
     return controller; 
    } 

    public class LogOn 
    { 
     [Fact] 
     public void Get_ReturnsViewResultWithDefaultViewName() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonSuccess(); 

      // Act 
      var result = controller.LogOn(); 

      // Assert 
      Assert.IsType<ViewResult>(result); 
      Assert.Empty(((ViewResult)result).ViewName); 
     } 

     [Fact] 
     public void Put_ReturnsOverviewRedirectToRouteResultIfLogonSuccessAndNoReturnUrlGiven() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonSuccess(); 
      var user = new LogOnModel(); 

      // Act 
      var result = controller.LogOn(user, null); 
      var redirectresult = (RedirectToRouteResult) result; 

      // Assert 
      Assert.IsType<RedirectToRouteResult>(result); 
      Assert.Equal("Overview", redirectresult.RouteValues["controller"]); 
      Assert.Equal("Index", redirectresult.RouteValues["action"]); 
     } 

     [Fact] 
     public void Put_ReturnsRedirectResultIfLogonSuccessAndReturnUrlGiven() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonSuccess(); 
      var user = new LogOnModel(); 

      // Act 
      var result = controller.LogOn(user, "someurl"); 
      var redirectResult = (RedirectResult) result; 

      // Assert 
      Assert.IsType<RedirectResult>(result); 
      Assert.Equal("someurl", redirectResult.Url); 
     } 

     [Fact] 
     public void Put_ReturnsViewIfInvalidModelState() 
     { 
      // Arrange 
      var controller = GetAccountControllerForLogonFailure(); 
      var user = new LogOnModel(); 
      controller.ModelState.AddModelError("*","Invalid model state."); 

      // Act 
      var result = controller.LogOn(user, "someurl"); 
      var viewResult = (ViewResult) result; 

      // Assert 
      Assert.IsType<ViewResult>(result); 
      Assert.Empty(viewResult.ViewName); 
      Assert.Same(user,viewResult.ViewData.Model); 
     } 

     [Fact] 
     public void Put_ReturnsViewIfLogonFailed() 
     { 
      // Arrange 

      var controller = GetAccountControllerForLogonFailure(); 
      var user = new LogOnModel(); 

      // Act 
      var result = controller.LogOn(user, "someurl"); 
      var viewResult = (ViewResult) result; 

      // Assert 
      Assert.IsType<ViewResult>(result); 
      Assert.Empty(viewResult.ViewName); 
      Assert.Same(user,viewResult.ViewData.Model); 
      Assert.Equal(false,viewResult.ViewData.ModelState.IsValid); 
     } 
    } 
} 

Répondre

2

cernées h Je dois réparer mes tests.

 [Fact] 
     public void Put_ReturnsRedirectToRouteResultForOverviewIfLogonSuccessAndNoReturnUrlGiven() 
     { 
      // Arrange 
      var mocks = new MockRepository(); 
      var mockMembershipService = mocks.StrictMock<IMembershipService>(); 
      using (mocks.Record()) 
      { 
       Expect.Call(mockMembershipService.ValidateUser("", "")).IgnoreArguments().Return(true).Repeat.Any(); 
      } 
      var controller = new AccountController(mockMembershipService); 
      var user = new LogOnModel(); 

      // Act 
      ActionResult result; 
      using (mocks.Playback()){ 
       result = controller.LogOn(user, null); 
      } 

     // Assert 
      Assert.IsType<RedirectToRouteResult>(result); 
      var redirectresult = (RedirectToRouteResult)result; 
      Assert.Equal("Overview", redirectresult.RouteValues["controller"]); 
      Assert.Equal("Index", redirectresult.RouteValues["action"]); 
     }