【发布时间】:2017-11-16 03:46:43
【问题描述】:
我想为存在于 BatchProcess 中的 SendMail 方法编写 Nunit 或单元测试,而不发送邮件。
如何模拟存在于另一个方法中的 SmtpClient。请帮忙。
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//Assuming we are populating the emails from the data from database
List<EmailEntity> emails = new List<EmailEntity>();
BatchProcess.SendMail(emails);
}
}
public class EmailEntity
{
public string ToAddress { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
public class BatchProcess
{
public static void SendMail(List<EmailEntity> emails)
{
foreach (EmailEntity email in emails)
{
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("sampleSmtp.sampleTest.com");
mail.From = new MailAddress("your_email_address@gmail.com");
mail.To.Add(email.ToAddress);
mail.Subject = email.Subject;
mail.Body = email.Body;
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
SmtpServer.EnableSsl = true;
SmtpServer.Send(mail);
}
}
}
}
【问题讨论】:
-
你可以把它放在接口 ISmtpClient 后面。
-
您的代码与实现问题紧密耦合,因此很难单独进行测试。应该有一个抽象层,可以提供更大的灵活性。如果您无法更改/重构 cmets 中提到的代码,那么您将需要执行针对实际 Smtp 服务的集成测试。
-
您可以使用Typemock Isolator。但是您要测试什么?
标签: c# unit-testing mocking nunit moq