我想为我的项目中的电子邮件和短信发送者编写单元测试,因为他们是开放式系统,我无法从头到尾测试他们的功能。所以我正在寻找一种智能的测试方式。
以下是我用来发送电子邮件和短信的代码:
电子邮件:
public void Send(MailMessage msg)
{
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Credentials = new NetworkCredential(emailSetting.EmailUser
, emailSetting.EmailPass);
client.Send(msg);
}
短信:
public void SendSMS( String toNumber, String message)
{
if (client != null)
client.SendSmsMessage(smsSetting.SMS_Num, toNumber, message);
}
答案 0 :(得分:3)
问题在于,如果您真的想要unit-test
s,那么您需要mock
邮件/短信客户端。
如果你想实际发送电子邮件(如果它们在一夜之间/在开发周期中运行会产生垃圾邮件),那么它们就不会被归类为单元测试,而是集成测试。
作为一个嘲弄的例子:
public class EmailThingy
{
private readonly IEmailClient _client;
public EmailThingy(IEmailClient client)
{
_client = client;
}
public void Send()
{
// do stuff with client
}
}
在您的单元测试中
[Test]
public void SendEmail()
{
var clientMock = MockRepository.GenerateMock<IEmailClient>();
// define behaviour for clientmock
var sut = new EmailThingy(clientMock);
sut.SendMail();
}
答案 1 :(得分:1)
短信 可以通过以下方式完成。
步骤1:导航到您的Web.Config文件并向其添加以下标记。
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="E:\MailTest\"/>
</smtp>
</mailSettings>
</system.net>
确保您为取件地点指定的目录必须存在。
第2步:现在测试您的电子邮件发送功能。我使用button_click使用以下代码测试此功能。
SmtpClient smtp = new SmtpClient();
MailMessage message = new MailMessage("me@gmail.com", "me@yahoo.com","My Message Subject","This is a test message");
smtp.Send(message);
输出:它将使用randonly生成的GUID名称在文件夹中创建.eml文件,这是我们收到后可以看到的电子邮件。对我来说,它创建了一个像c127d1d5-255d-4a5a-873c-409e23002eef.eml in E:\MailTest\ folder
答案 2 :(得分:0)
这是依赖注入解决方案和模拟的经典之作。
编写代码,就好像您可以使用多种SMS解决方案中的任何一种一样。
创建一个接口,说ISMS的方法是发送(收件人,消息);
然后在直接调用sms内容的代码中实现它。
当你有一些需要短信功能的东西时,你实例化你想要使用的实现并将它传递给那个代码。现在它并不关心什么是SMS以及如何。
查看服务定位器模式以获得实现此目的的好方法。
在单元测试方面,您可以创建一个实现接口并注入该接口的模拟类。它不会发送短信,但可能会检查收件人和邮件是否有效,但它不会向整个团队发送测试数据。
测试你的短信实现工作然后单独完成,因为它不关心为什么,何时或什么消息被发送。
如果你想进行端到端测试,那么这将是一个集成测试,而不是单元测试,因为它不仅仅涉及一个单元。