2016-09-26 3 views
-2

Я пишу тест для CheckPassWord() Я предполагаю, что вызов Expect не ведет себя так, как ожидалось, на моем userMangerMock.Ожидать вызова не работает на mock

//CheckPassword returns true if the parameter matches to the exsting user. 
//Existing user is obtained by GetUser() by internal call 
    bool passWordMatch = userMangerMock.CheckPassword(userInfo.Id, userInfo.Password); 

CheckPassWord() внутренне вызывает GetUser(), С GetUser() нуждается в более глубокие внутренние вызовы, я решил возвращать stubUser Я считаю, что реализация Ожидать() достаточно для этого. Обратите внимание, что следующий звонок var userInfo = userMangerMock.GetUser("TestManager"); возвращает stubUser. Но, CheckPassword() звонок Я принимаю, что stubUser не возвращается, поэтому тест не работает.

Исправьте меня, если есть ошибка в следующем UT.

//Use TestInitialize to run code before running each test 
    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     CreateUser(); 
    } 
    private static IUser _stubUser; 

    public void CreateUser() 
    { 
     IUserFactory iUserFactory = new UserFactory(); 

     UserParams parameters = new UserParams(); 
     parameters.Password = "TestPassword123!"; 
     parameters.UserID = "TestManager"; 
     _stubUser = iUserFactory.CreateUser(parameters); 
    }  

    /// <summary> 
    ///A test for CheckPassword 
    ///</summary> 
    [TestMethod()] 
    public void CheckPasswordTest() 
    { 
     // !!! Below I've used WhenCalled() to show you that correct 
     // expectation is called based on argument type, just see in debugger 
     IUserManager userMangerMock = MockRepository.GenerateMock<IUserManager>(); 
     userMangerMock.Expect(x => x.GetUser(Arg<string>.Is.Anything)) 
        .WhenCalled((mi) => 
        { 
         Debug.WriteLine("IUserManager - string parameter"); 
        }) 
        .Return(_stubUser); 

     var userInfo = userMangerMock.GetUser("TestManager"); 

     bool passWordMatch = userMangerMock.CheckPassword(userInfo.Id, userInfo.Password); 
     userMangerMock.VerifyAllExpectations(); 

     Assert.AreEqual(true, passWordMatch); 
    } 

    /// <summary> 
    /// Returns true if password matches the user 
    /// </summary> 
    public bool CheckPassword(string userId, string password) 
    { 
     if (userId == null) 
     { 
      throw new ArgumentNullException("userId"); 
     } 

     IUser user = GetUser(userId); 
     if (user == null) 
     { 
      throw new UserManagementException(UserManagementError.InvalidUserId); 
     } 

     return (user.Password == password); 
    } 
+3

кодекса Вы разместили не выглядят как настоящее модульное тестирование - это никогда не называют ничего, кроме насмешек. Пожалуйста, проверьте код тестирования устройства, а также продемонстрируйте, какую реализацию вы пытаетесь протестировать. –

+0

Его явное указание CheckPassword на bool passWordMatch = userMangerMock.CheckPassword (userInfo.Id, userInfo.Password); Я обновил реализацию CheckPassword(). – Srikanth

+0

userManagerMock.CheckPassword() вызывает метод на макет-объекте. Вы не вызываете никакого реального кода в этот момент. – Pedro

ответ

1

Несколько вещей, которые я заметил в тесте:

userMangerMock.VerifyAllExpectations();

Это всегда будет проходить, так как вы вручную вызова GetUser() в самом тестовом коде:

var userInfo = userMangerMock.GetUser("TestManager");

Таким образом, вы действительно можете удалить этот проверочный звонок, поскольку он не нужен.

Похоже, что ваш юнит-тест, похоже, не представляет для вас никакой ценности, поскольку он утверждает, что он является жестко закодированным макетным объектом.

var userInfo = userMangerMock.GetUser("TestManager"); 

    bool passWordMatch = userMangerMock.ChePassword(userInfo.Id, userInfo.Password); 

    Assert.AreEqual(true, passWordMatch); 

Если userInfo является ссылкой на объект заглушки _stubUser то вы модульное тестирование могут быть переработаны в:

bool passWordMatch = userMangerMock.CheckPassword(_stubUser.Id, _stubUser.Password); 

Assert.AreEqual(true, passWordMatch);