通常,当我需要嘲笑一个类进行测试时,我会使用一个库,如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()
);
}
在上述试验中,我使用犀牛制品产生的模拟和断言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()
方法中,但是这会使测试很难理解,因为当我看着测试时我不会立即看到发生了什么。