c# - 模拟验证交互

标签 c# .net unit-testing mocking rhino-mocks

通常,当我需要模拟一个类进行测试时,我会使用 Rhino Mocks 等库。这里我有一个名为 MyService 的类,它需要一个 IEmailSender

public class MyService
{
    private readonly IEmailSender sender;

    public MyService(IEmailSender sender)
    {
        this.sender = sender;
    }

    public void Start()
    {
        this.sender.SendEmail();
    }
}

如果我需要测试这两个对象之间的交互,我的测试将如下所示:

[TestMethod]
public void Start_Test_Using_Rhino_Mocks()
{
    IEmailSender emailSender = MockRepository.GenerateMock<IEmailSender>();

    MyService service = new MyService(emailSender);
    service.Start();

    emailSender.AssertWasCalled
        (
            x => x.SendEmail(),
            c => c.Repeat.Once()
        );
}

在上面的测试中,我使用 Rhino Mocks 生成模拟并断言 SendEmail() 方法被调用了一次。

但是,如果我不能使用 Rhino Mocks 而不得不创建手动模拟怎么办?

public class MockEmailSender : IEmailSender
{
    public void SendEmail()
    {
    }
}

[TestMethod]
public void Start_Test_Using_Manual_Mocks()
{
    MockEmailSender emailSender = new MockEmailSender();

    MyService service = new MyService(emailSender);
    service.Start();

    // How do I test the interaction?
}

使用我手动创建的 mock,我如何验证调用了 SendEmail() 方法?我可以将我的断言放在模拟的 SendEmail() 方法中,但这会使测试难以理解,因为我在查看测试时不会立即看到发生了什么。

最佳答案

一个非常简单的解决方案是让您的手动模拟只是一个状态持有者,带有对每个方法调用的计数器。但它很脆弱......

public class MockEmailSender : IEmailSender
{
    public int SendCount = 0;

    public void SendMail(...)
    {
        SendCount++;
    }

    // ... other IEmailSender methods ...
}

然后在调用方法后查询 SendCount,并确保它 == 1。

请记住,Rhino Mocks 正在为您动态创建此内容——如果您手动执行此操作,则必须在编译时间之前手动对界面更改使用react。

关于c# - 模拟验证交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6532498/

相关文章:

.net - 使用 WiX 安装程序打开 Windows 功能

.net - .NET Core 1.1.1 和 1.0.4 版本之间的区别

android - 单元测试逼真的Android类。测试环境,生命周期和响应

c# - 如何使用内连接将两个 DataTable 连接在一起

c# - JavaScript 中的 SignalR : What's the equivalent of 'NetworkCredential("user", "password")'?

c# - 语句 "delegates are secure"是什么意思?

AngularJS/Karma - 指令中的单元测试功能

javascript - 如何解决运行测试时代码覆盖率未找到函数的问题?

c# - 按顺序使用数组获取文件

c# - 无法连接到mysql数据库C#