Почему мой Moq утверждает, что никакие вызовы не выбрасываются, но он отображает брошенный вызов в исключении? - PullRequest
8 голосов
/ 30 марта 2011

У меня есть следующий модульный тест:

[TestMethod]
public void Execute_Sends_Email_To_User()
{
    // Setup
    InitializeTestEntities();
    _mock.Setup(x => x.Send(It.Is<string>(y => y == _user.Email), 
        It.IsAny<string>(), It.IsAny<string>()));

    // Act
    new ResetUserPasswordCommand(_unitOfWork, 
        _mock.Object).WithUserId(_user.Id).Execute();

    // Verify
    _mock.Verify(x => x.Send("", "", ""), Times.Once());
}

Когда он запускается, я получаю следующее сообщение об исключении

Test method 
MyApp.Tests.Commands.Users.ResetUserPasswordCommandTests.Execute_Sends_Email_To_User 
threw exception: 

Moq.MockException: 
Expected invocation on the mock once, but was 0 times: x => x.Send("", "", "")

Configured setups:
x => x.Send(It.Is<String>(y => y == ._user.Email), It.IsAny<String>(), 
    It.IsAny<String>()), Times.Once

Performed invocations:
IEmailUtils.Send("test@email.com", "Password Recovery", 
    "Your new password is: 7Xb79Vb9Dt")

Я запутался в этом, потому что он говорит, чтоmock был вызван 0 раз, но это показывает, что успешный вызов.Что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 30 марта 2011

вам нужно

_mock.Verify(x => x.Send(
     It.IsAny<String>(), It.IsAny<String>(), It.IsAny<String>(), Times.Once());

, потому что он не соответствует переданным аргументам. Поэтому он думает, что он не вызывал этот метод с этими аргументами.

Вы можете проверить, что конкретныйСтроки передаются в метод mock, но это будет зависеть от того, что вы пытаетесь проверить

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

0 голосов
/ 22 апреля 2019

Если число параметров не совпадает или их тип не совпадает, nunit выдаст ошибку времени компиляции, но в моем случае я использовал It.IsAny<int> вместо It.IsAny<long>, и это не дало никакой ошибки компиляции, но тест не прошел. Позже я понял, что тип данных в то время как насмешка должна быть точной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...