2016-03-22 5 views
1

Я разрабатываю приложение на ASP.NET MVC 4. Я использую TDD-подход для разработки моего приложения. Вначале я пытаюсь реализовать модуль входа для приложения. Технически для входа в систему необходимо выполнить следующие действия:MVC Moq mutliple зависимостей

  1. Проверьте, что учетная запись пользователя не заблокирована и ее действительный пользователь. (Если пользователь пытается войти в систему несколько раз, он должен заблокировать учетную запись после 5 неудачных попыток. Для этого у меня есть полев моей базе данных, которое я обновляю после каждой неудачной попытки)
  2. Если учетная запись проверена, пользователь с loginId и пароль, используя стороннюю услугу.
  3. Если подтверждено, Пользователь должен быть перенаправлен на страницу индекса.

Для достижения этих задач, я создал:

// Interface, Controller will interact with  
public Interface IAuthenticate 
{ 
    bool ValidateUser(string UserId,string Password); 
} 

// Class that implement IAuthenticate 
public class Authenticate : IAuthenticate 
{ 

    private IVerifyUser loginVerify; 
    private IThirdPartyService thirdpartyService; 

    public Authenticate(IVerifyUser user,IThirdPartyService thirdparty) 
    {  
     this.loginVerify=user; 
     this.thirdpartyService=thirdparty;  
    } 

    public bool ValidateUser(string userId,string password) 
    { 
     if(loginVerify.Verify(userId)) 
     { 
      if(thirdpartyService.Validate(userId,password)) 
       return true; 
      else 
       return false;  
     } 
     else 
      return false; 
    } 
} 

Чтобы проверить мой контроллер Вход, я должен просто создать макет для IAuthenticate или мне нужно создать макет для IVerifyUser и IThirdPartyService? ?

[TestMethod] 
public void Login_Rerturn_Error_If_UserId_Is_Incorrect() 
{ 
    Mock<IAuthenticate> mock1 = new Mock<IAuthenticate>(); 

    mock1.Setup(x => x.ValidateUser("UserIdTest", "PasswordTest")) 
     .Returns(false); 

    var results = controller.Login(); 
    var redirect = results as RedirectToRouteResult; 

    Assert.IsNotNull(results); 
    Assert.IsInstanceOfType(results, typeof(RedirectToRouteResult)); 

    controller.ViewData.ModelState.AssertErrorMessage("Provider", "User Id and Password is incorrect"); 

    Assert.AreEqual("Index", redirect.RouteValues["action"], "Wrong action"); 

    Assert.AreEqual("Home", redirect.RouteValues["controller"], "Wrong controller"); 
} 

Любые рекомендации действительно оценены ??

ответ

1

Если вы тестируете свой контроллер, а ваш контроллер имеет зависимость от экземпляра IAuthenticate, то это все, что вам нужно высмеять. Издеваясь над этим, вы игнорируете любую фактическую реализацию внутри него. Вы только проверяете поведение контроллера, учитывая конечное поведение с использованием IAuthenticate.

В ваших модульных тестах тестов для вашей реализации IAuthenticate вы бы тогда издеваться над его зависимостью (IVerifyUser и IThirdPartyService), чтобы проверить, как он ведет себя при определенном конечный результат от любого из их методов.

Если вам нужно уточнение, прокомментируйте! :)

+0

Не могли бы вы предоставить более подробную информацию? Как бы я это сделал, любые рекомендации будут действительно оценены. – Faisal

+0

Также, если мне нужно протестировать IVerifyUser и IThirdPartyService ?? – Faisal