Ожидать, что вызов не работает на макете

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

//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Я считаю, что реализация Expect() достаточно для этого. Обратите внимание, что следующий вызов 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);
    }

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);
Другие вопросы по тегам