通常,當我需要嘲笑一個類進行測試時,我會使用一個庫,如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()
方法中,但是這會使測試很難理解,因爲當我看着測試時我不會立即看到發生了什麼。