我有以下单元测试:
[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")
我对此感到困惑,因为它说模拟被调用了0次,但它显示了成功的调用。我做错了什么?
答案 0 :(得分:6)
你需要
_mock.Verify(x => x.Send(
It.IsAny<String>(), It.IsAny<String>(), It.IsAny<String>(), Times.Once());
因为它与传入的参数不匹配。因此它认为它没有用这些参数调用该方法。
您可以验证特定字符串是否已传递到mock方法,但这取决于您要测试的内容
在您的特定情况下,安装方法没有意义,因为验证仍然有效。只有当您需要从模拟方法返回值时,才真正需要使用安装程序。
答案 1 :(得分:-1)
如果参数计数不匹配或它们的类型不匹配,nunit将给出编译时错误,但是在我的情况下,我使用It.IsAny<int>
而不是It.IsAny<long>
,但没有给出任何编译错误,但是测试失败。后来,我意识到了模拟必须精确的数据类型。