c# - 为什么我的 Moq 声称没有抛出任何调用,但它在异常中显示抛出的调用?

标签 c# unit-testing moq

我有以下单元测试:

[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 次,但它表明调用成功。我做错了什么?

最佳答案

你需要

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

因为它与传入的参数不匹配。因此它认为它没有使用这些参数调用该方法。

您可以验证特定字符串是否已传递到 mock 方法中,但这取决于您要测试的内容

在您的特定情况下,设置方法没有意义,因为验证仍然有效。只有当您需要从模拟方法返回一个值时,您才真正需要使用 Setup。

关于c# - 为什么我的 Moq 声称没有抛出任何调用,但它在异常中显示抛出的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5481863/

相关文章:

c# - 需要 TDD 方法的想法

c# - 获取没有查询字符串的url

c# - 如何模拟 IDataReader 以测试将 SqlDataReader 转换为 System.DataView 的方法

c++ - 如何传递带有虚方法的类以及如何将其用作成员变量?

unit-testing - 单元测试第三方ORM

c# - 如何使用Moq框架对azure服务结构进行单元测试?

c# - XMS.Net 2.1.0.0/1 CWSMQ0282E

c# - 如何(单元)测试弱引用列表的内存管理功能?

c# - ASP.NET登录控件连接字符串错误: Keyword not supported: 'metadata'

coding-style - FakeItEasy 回调实现