【发布时间】:2011-06-30 09:09:10
【问题描述】:
通常,当我需要模拟一个类进行测试时,我会使用 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?
}
使用我手动创建的模拟,我将如何验证 SendEmail() 方法是否被调用?我可以将我的断言放在模拟的 SendEmail() 方法中,但这会使测试难以理解,因为当我查看测试时我不会立即看到发生了什么。
【问题讨论】:
标签: c# .net unit-testing mocking rhino-mocks