Sur*_*ian 2 c# nunit unit-testing moq mocking
我想为 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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是您应该使用Dependency Injection的原因之一。
关键是你不应该创建SmtpClient
in的实例SendMail()
。最好在SmtpClient
实现ISmtpClient
接口上定义包装器并将该接口传递给构造函数,BatchProcess
以便您可以在测试中模拟它:
public interface ISmtpClient
{
int Port { get; set; }
ICredentialsByHost Credentials { get; set; }
bool EnableSsl { get; set; }
void Send(MailMessage mail);
}
public class SmtpClientWrapper : SmtpClient, ISmtpClient
{
}
public class BatchProcess
{
private readonly ISmtpClient smtpClient;
BatchProcess(ISmtpClient smtpClient)
{
this.smtpClient = smtpClient;
}
public void SendMail(List<EmailEntity> emails)
{
foreach (EmailEntity email in emails)
{
MailMessage mail = new MailMessage();
mail.From = new MailAddress("your_email_address@gmail.com");
mail.To.Add(email.ToAddress);
mail.Subject = email.Subject;
mail.Body = email.Body;
// You could leave this configuration here but it's far better to have it configured in SmtpClientWrapper constructor
// or at least outside the loop
smtpClient.Port = 587;
smtpClient.Credentials = new System.Net.NetworkCredential("username", "password");
smtpClient.EnableSsl = true;
smtpClient.Send(mail);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2301 次 |
最近记录: |