1

我想为我的项目中的电子邮件和短信发件人编写单元测试,当然,因为它们是开放系统,我无法从头到尾测试它们的功能。所以我正在寻找一种聪明的方法来测试它们。

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

电子邮件:

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

3 回答 3

3

问题在于,如果您真的要使用unit-tests,那么您会想要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();
    }
于 2013-02-10T12:27:54.470 回答
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);

输出:它将在文件夹中创建 .eml 文件,其中包含随机生成的 GUID 名称,这是我们收到后可以看到的电子邮件。对我来说,它创建了一个像c127d1d5-255d-4a5a-873c-409e23002eef.eml in E:\MailTest\ folder

于 2013-02-10T12:26:13.133 回答
0

这是依赖注入解决方案和模拟的经典之作。

编写您的代码,就好像您可以使用许多 SMS 解决方案中的任何一个一样。

创建一个接口,说 ISMS,方法是 Send(recipient, message);

然后在直接调用短信内容的代码中实现它。

当您有需要短信功能的东西时,您可以实例化您想要使用的实现并将其传递给该代码。现在它不关心短信是什么以及如何。

查看服务定位器模式,了解一个很好的方法。

当涉及到单元测试时,您可以创建一个模拟类来实现接口并注入它。它不发送短信,它可能会检查收件人和消息是否有效,但它不会向整个团队发送测试数据垃圾邮件。

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

如果您想进行端到端测试,那将是集成测试而不是单元测试,因为所涉及的远不止一个单元。

于 2013-02-10T12:43:28.910 回答