Альтернативный способ сделать это, чтобы создать оболочку вокруг SmtpClient, который реализует тот же интерфейс. Затем вставьте и используйте обертку в своем классе. При проведении модульного тестирования вы можете заменить фальшивую оболочку, которая имеет ожидания для вызовов и ответов метода.
EDIT: необходима оболочка (для RhinoMocks, по крайней мере), потому что SmtpClient не вытекает из интерфейса и не имеет виртуальных методов. Если вы используете фальшивую фреймворк, которая может издеваться над классом без виртуальных методов напрямую, вы можете пропустить оболочку и непосредственно вставить SmtpClient.
public class SmtpClientWrapper
{
private SmtpClient Client { get; set; }
public SmtpClientWrapper(SmtpClient client)
{
this.Client = client;
}
public virtual void Send(MailMessage msg)
{
this.Client.Send(msg);
}
...
}
public class MyClass
{
private SmtpClientWrapper Client { get; set; }
public MyClass(SmtpClientWrapper client)
{
this.Client = client;
}
public void DoSomethingAndNotify()
{
...
this.Client.Send(msg);
}
}
Испытано (с RhinoMocks) как:
public void DoSomethingAndNotifySendsAMessageTest()
{
SmtpClientWrapper client = MockRepository.GenerateMock<SmtpClientWrapper>();
client.Expect(c => c.Send(new MailMessage())).IgnoreArguments();
MyClass klass = new MyClass(client);
klass.DoSomethingAndNotify();
client.VerifyAllExpectations();
}
Dumbster позволяет вашему модульному тестированию запускать службу SMTP, проверять код отправки, а затем делать утверждения о том, сколько сообщений электронной почты было отправлено, каково их содержимое и т. Д. –
nDumpster, похоже, не поддерживается и очень медленный, поэтому он не подходит для модульных тестов. См. Http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/mocking-out-an-email-server.aspx. –