使用SmtpClient发送Email时,我们可以创建ISmtpClient接口和SmtpClientWrapper适配类,在单元测试中对ISmtpClient进行Mock或自定义FackeSmtpClient,但nDumbster的Facke SMTP Server给我们提供了更直观更简单的方式进行单元测试。可以通过Nuget搜索nDumbster,这里使用的是netDumbster。
1.IEmailSender接口publicinterfaceIEmailSender
{voidSendMail(stringfrom,stringto,stringsubject,stringbody);
}
2.SMTPAdapter实现类publicinterfacepublicclassSMTPAdapter : IEmailSender
{publicvoidSendMail(stringfrom,stringto,stringsubject,stringbody)
{varmessage =newMailMessage();
message.IsBodyHtml=true;
message.From=newMailAddress(from);
message.To.Add(newMailAddress(to));
message.Subject=subject;
message.Body=body;using(varsmtpClient =newSmtpClient())
{if(smtpClient.Host ==null)
{
smtpClient.Host="localhost";
}
smtpClient.Send(message);
}
}
}
3.使用nDumbster单元测试publicclassSMTPAdapterTest
{
[Fact]publicvoidSendMailTest()
{
SimpleSmtpServer server= SimpleSmtpServer.Start(25);
IEmailSender sender=newSMTPAdapter();
sender.SendMail("sender@here.com","receiver@there.com","subject","body");
Assert.Equal(1, server.ReceivedEmailCount);
SmtpMessage mail= (SmtpMessage)server.ReceivedEmail[0];
Assert.Equal("sender@here.com", mail.Headers["From"]);
Assert.Equal("receiver@there.com", mail.Headers["To"]);
Assert.Equal("subject", mail.Headers["Subject"]);
Assert.Equal("body", mail.MessageParts[0].BodyData);
server.Stop();
}
}
运行结果:
[flash=500,400]http://s1.knowsky.com/20160211/oxy4v51yobx18.png[/flash]