在C#中编写开放系统(如电子邮件或SMS发件人)的单元测试

时间:2013-02-10 12:22:52

标签: c# unit-testing testing

我想为我的项目中的电子邮件和短信发送者编写单元测试,因为他们是开放式系统,我无法从头到尾测试他们的功能。所以我正在寻找一种智能的测试方式。

以下是我用来发送电子邮件和短信的代码:

电子邮件:

    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);
    }

3 个答案:

答案 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以及如何。

查看服务定位器模式以获得实现此目的的好方法。

在单元测试方面,您可以创建一个实现接口并注入该接口的模拟类。它不会发送短信,但可能会检查收件人和邮件是否有效,但它不会向整个团队发送测试数据。

测试你的短信实现工作然后单独完成,因为它不关心为什么,何时或什么消息被发送。

如果你想进行端到端测试,那么这将是一个集成测试,而不是单元测试,因为它不仅仅涉及一个单元。