Una forma alternativa de hacer esto es crear una envoltura alrededor de la SmtpClient que implementa la misma interfaz. Luego, inyecta y usa el contenedor en tu clase. Al hacer pruebas unitarias, puede sustituir un contenedor simulado que tenga expectativas para las llamadas y respuestas al método.
EDIT: El envoltorio es necesario (para RhinoMocks, al menos) porque SmtpClient no se deriva de una interfaz y no tiene métodos virtuales. Si usa un marco de simulación que puede simular una clase directamente sin métodos virtuales, puede omitir el envoltorio e inyectar el simulacro de SmtpClient directamente.
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);
}
}
Probado (con RhinoMocks) como:
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 permite que su unidad pruebe el servicio SMTP, pruebe algún código de envío y luego haga afirmaciones sobre cuántos correos electrónicos se enviaron, cuáles fueron sus contenidos, etc. –
nDumpster parece no estar en mantenimiento y es muy lento, por lo que no es realmente adecuado para pruebas unitarias. Ver http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/mocking-out-an-email-server.aspx. –