Обычно, когда мне нужно макетировать класс для тестирования, я использую такую библиотеку, как 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()
, но это затруднило бы понимание теста, поскольку я не сразу вижу, что происходит, когда смотрю на тест.