Eine alternative Möglichkeit, dies zu tun, ist einen Wrapper um die SmtpClient zu erstellen, die die gleiche Schnittstelle implementiert. Dann injiziere und benutze den Wrapper in deiner Klasse. Wenn Sie Komponententests durchführen, können Sie einen falschen Wrapper ersetzen, der Erwartungen für die Methodenaufrufe und -antworten hat.
BEARBEITEN: Der Wrapper wird benötigt (zumindest für RhinoMocks), weil SmtpClient nicht von einer Schnittstelle abgeleitet ist und keine virtuellen Methoden hat. Wenn Sie ein Mock-Framework verwenden, das eine Klasse ohne virtuelle Methoden direkt vortäuschen kann, können Sie den Wrapper überspringen und den SmtpClient-Mock direkt injizieren.
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);
}
}
getestet (mit RhinoMocks) als:
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();
}
Mit Dumbster können Sie mit dem Gerätetest den SMTP-Dienst starten, einen bestimmten Sendecode testen und dann Aussagen darüber machen, wie viele E-Mails gesendet wurden, was deren Inhalt waren und so weiter. –
nDumpster scheint nicht gewartet zu werden und ist sehr langsam, also nicht wirklich für Komponententests geeignet. Siehe http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/mocking-out-an-email-server.aspx. –