Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C语言编写开放系统(如电子邮件或SMS发送者)的单元测试#_C#_Unit Testing_Testing - Fatal编程技术网

C# 用C语言编写开放系统(如电子邮件或SMS发送者)的单元测试#

C# 用C语言编写开放系统(如电子邮件或SMS发送者)的单元测试#,c#,unit-testing,testing,C#,Unit Testing,Testing,我想为我的项目中的电子邮件和短信发送者编写单元测试,当然,因为它们是开放系统,所以我无法从端到端测试它们的功能。所以我在寻找一种聪明的方法来测试它们 以下是我用来发送电子邮件和短信的代码: 电邮:     public void Send(MailMessage msg) { SmtpClient client = new SmtpClient("smtp.gmail.com", 587); client.EnableSsl = true;

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

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

电邮:

    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);
    }
短信 可以通过以下方式完成

步骤1:导航到Web.Config文件并向其中添加以下标记

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="E:\MailTest\"/>
        </smtp>
    </mailSettings>
</system.net>
输出:它将在文件夹中创建.eml文件,并使用randonly生成的GUID名称,这是我们收到后可以看到的电子邮件。对我来说,它在E:\MailTest\folder

中为sms创建了一个类似于
c127d1d5-255d-4a5a-873c-409e23002ef.eml的文件
可以通过以下方式完成

步骤1:导航到Web.Config文件并向其中添加以下标记

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="E:\MailTest\"/>
        </smtp>
    </mailSettings>
</system.net>

输出:它将在文件夹中创建.eml文件,并使用randonly生成的GUID名称,这是我们收到后可以看到的电子邮件。对我来说,它在E:\MailTest\folder
中创建了一个类似于
c127d1d5-255d-4a5a-873c-409e23002ef.eml的文件。问题是,如果你真的要进行
单元测试
的话,你就要模拟邮件/短信客户端

如果您想要实际发送电子邮件(如果在夜间/开发周期中运行,则会导致垃圾邮件),那么它们不会被归类为单元测试,而是集成测试

作为一个嘲弄的例子:

 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();
    }
[测试]
public void sendmail()
{
var clientMock=MockRepository.GenerateMock();
//定义clientmock的行为
var sut=新的EmailThingy(clientMock);
sut.SendMail();
}

问题在于,如果您真的要进行
单元测试
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();
    }
[测试]
public void sendmail()
{
var clientMock=MockRepository.GenerateMock();
//定义clientmock的行为
var sut=新的EmailThingy(clientMock);
sut.SendMail();
}

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

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

创建一个接口,比如ISMS,方法是Send(收件人,消息)

然后在直接调用sms的代码中实现它

当你有一些需要sms功能的东西时,你可以实例化你想要使用的实现并将其传递给代码。现在,它不关心短信的作用和方式

请查看服务定位器模式,以了解执行此操作的好方法

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

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


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

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

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

创建一个接口,比如ISMS,方法是Send(收件人,消息)

然后在直接调用sms的代码中实现它

当你有一些需要sms功能的东西时,你可以实例化你想要使用的实现并将其传递给代码。现在,它不关心短信的作用和方式

请查看服务定位器模式,以了解执行此操作的好方法

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

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


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

实际上我正在开发一个控制台应用程序,我想在不发送电子邮件的情况下测试电子邮件。这与您的案例有点不同吗?您可以在项目和其他需要的程序集中添加app.config,并测试此代码+1,但请记住,这现在是一个集成测试。单元测试在完全隔离的情况下测试类和对象。因此,您的解决方案完全取决于您要测试的内容。实际上,我正在开发一个控制台应用程序,我想在不发送电子邮件的情况下测试电子邮件。这与您的情况有点不同吗?您可以在项目和其他需要的程序集中添加app.config,并测试此代码+1,但请记住,这现在是一个集成测试。单元测试在完全隔离的情况下测试类和对象。因此,您的解决方案完全取决于您要测试的内容。听起来是一个不错的解决方案,我必须先阅读有关mocks的内容,但是您能告诉我测试方法中会发生什么吗?您添加的所有业务逻辑都可以通过这种方式进行测试。其思想是,您可以模拟不是SuT(测试中的系统)一部分的部分。因此,在您的情况下,发送实际电子邮件不是您编写的逻辑。这是一个你使用的框架。如果你正确地调用它,它只会做它应该做的事情(发送电子邮件)。另一个逻辑是您希望邮件如何发送,即