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(测试中的系统)一部分的部分。因此,在您的情况下,发送实际电子邮件不是您编写的逻辑。这是一个你使用的框架。如果你正确地调用它,它只会做它应该做的事情(发送电子邮件)。另一个逻辑是您希望邮件如何发送,即