如何使用最小起订量模拟新实例
How to mock new instance using moq
我想通过模拟 MailMessage
和 SmptpClient
使用最小起订量测试以下方法
public void SendEmail(string emailAddress, string subject, string body)
{
using (var mail = new MailMessage(NoReplyEmailAddress, emailAddress))
{
mail.Subject = subject;
mail.Body = body;
mail.IsBodyHtml = true;
using (var client = new SmtpClient())
{
client.Host = SmtpHost;
client.Port = SmtpPort;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(mail);
}
}
}
我的测试方法是:
public void TestSendEmail()
{
Mock<MailMessage> mailMessageMock = new Mock<MailMessage>();
MailMessage message = (MailMessage)mailMessageMock.Setup(m => new MailMessage()).Returns(mailMessageMock.Object);
Mock<SmtpClient> smtpClientMock = new Mock<SmtpClient>();
smtpClientMock.Setup(s => new SmtpClient()).Returns(smtpClientMock.Object);
EmailService emailService = new EmailService();
emailService.SendEmail("tester@gmail.com","Test Mail", "Content");
mailMessageMock.Verify(m => m.Subject);
mailMessageMock.Verify(m => m.Body);
mailMessageMock.Verify(m => m.IsBodyHtml);
smtpClientMock.Verify(s=>s.Host);
smtpClientMock.Verify(s=>s.Port);
smtpClientMock.Verify(s=>s.DeliveryMethod);
smtpClientMock.Verify(s=>s.Send(message));
}
但是它不起作用有没有办法做到这一点?
为了模拟 MailMessage 和 SMTPClient 类 它们应该被注入到 EmailServiceConstructor
public class EmailService {
//Constructor
public EmailService(MailMessage mailmsgObj, SmtpClient smtpClient)
{
}
}
然后您可以在测试用例中创建 EmailServiceObject 时为 MailMessage 和 smtpclient 注入模拟的 类
Mock<MailMessage> mailMessageMock = new Mock<MailMessage>();
MailMessage message = (MailMessage)mailMessageMock.Setup(m => new MailMessage()).Returns(mailMessageMock.Object);
Mock<SmtpClient> smtpClientMock = new Mock<SmtpClient>();
smtpClientMock.Setup(s => new SmtpClient()).Returns(smtpClientMock.Object);
EmailService emailService = new EmailService(mailMessageMock.object,smtpClientMock.object);
您的代码无法测试,您可以通过多种方式修复它,例如:
创建 SmtpClient
和 MailMessage
类型的抽象:
public interface ISmtpClient
{
void Send(MailMessage msg, string host, int port, SmtpDeliveryMethod deliveryMethod);
}
public interface IMailMessageComposer
{
MailMessage Create(string noReplyEmailAddress, string emailAddress, string subject, string body, bool isHtml);
}
使用您的逻辑创建非常简单的实现:
public class MySmtpClient : ISmtpClient
{
public void Send(MailMessage msg, string host, int port, SmtpDeliveryMethod deliveryMethod)
{
using (var client = new SmtpClient())
{
client.Host = host;
client.Port = port;
client.DeliveryMethod = deliveryMethod;
client.Send(msg);
}
}
}
public class MailMessageComposer : IMailMessageComposer
{
public MailMessage Create(string noReplyEmailAddress, string emailAddress, string subject, string body, bool isHtml)
{
return new MailMessage(noReplyEmailAddress, emailAddress)
{
Subject = subject,
Body = body,
IsBodyHtml = isHtml
};
}
}
然后将这些依赖项注入负责发送电子邮件的class:
public class EmailService
{
private readonly ISmtpClient _smtpClient;
private readonly IMailMessageComposer _mailMessageComposer;
public EmailService(ISmtpClient smtpClient, IMailMessageComposer mailMessageComposer)
{
_smtpClient = smtpClient;
_mailMessageComposer = mailMessageComposer;
}
public void SendEmail(string emailAddress, string subject, string body)
{
var message = _mailMessageComposer.Create(NoReplyEmailAddress, emailAddress, subject, body, true);
_smtpClient.Send(message, SmtpHost, SmtpPort, SmtpDeliveryMethod.Network);
}
}
现在您可以分别测试 SmtpClient 和 MailMessage。
测试:
public void Create_MailMessage()
{
var mailComposer = new MailMessageComposer();
var mailMessage = mailComposer.Create("noReply@example.com", "email@example.com", "subject", "body", true);
Assert.Equal("noReply@example.com", mailMessage.Subject);
Assert.Equal("body", mailMessage.Body);
//etc.
}
我想通过模拟 MailMessage
和 SmptpClient
public void SendEmail(string emailAddress, string subject, string body)
{
using (var mail = new MailMessage(NoReplyEmailAddress, emailAddress))
{
mail.Subject = subject;
mail.Body = body;
mail.IsBodyHtml = true;
using (var client = new SmtpClient())
{
client.Host = SmtpHost;
client.Port = SmtpPort;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(mail);
}
}
}
我的测试方法是:
public void TestSendEmail()
{
Mock<MailMessage> mailMessageMock = new Mock<MailMessage>();
MailMessage message = (MailMessage)mailMessageMock.Setup(m => new MailMessage()).Returns(mailMessageMock.Object);
Mock<SmtpClient> smtpClientMock = new Mock<SmtpClient>();
smtpClientMock.Setup(s => new SmtpClient()).Returns(smtpClientMock.Object);
EmailService emailService = new EmailService();
emailService.SendEmail("tester@gmail.com","Test Mail", "Content");
mailMessageMock.Verify(m => m.Subject);
mailMessageMock.Verify(m => m.Body);
mailMessageMock.Verify(m => m.IsBodyHtml);
smtpClientMock.Verify(s=>s.Host);
smtpClientMock.Verify(s=>s.Port);
smtpClientMock.Verify(s=>s.DeliveryMethod);
smtpClientMock.Verify(s=>s.Send(message));
}
但是它不起作用有没有办法做到这一点?
为了模拟 MailMessage 和 SMTPClient 类 它们应该被注入到 EmailServiceConstructor
public class EmailService {
//Constructor
public EmailService(MailMessage mailmsgObj, SmtpClient smtpClient)
{
}
}
然后您可以在测试用例中创建 EmailServiceObject 时为 MailMessage 和 smtpclient 注入模拟的 类
Mock<MailMessage> mailMessageMock = new Mock<MailMessage>();
MailMessage message = (MailMessage)mailMessageMock.Setup(m => new MailMessage()).Returns(mailMessageMock.Object);
Mock<SmtpClient> smtpClientMock = new Mock<SmtpClient>();
smtpClientMock.Setup(s => new SmtpClient()).Returns(smtpClientMock.Object);
EmailService emailService = new EmailService(mailMessageMock.object,smtpClientMock.object);
您的代码无法测试,您可以通过多种方式修复它,例如:
创建 SmtpClient
和 MailMessage
类型的抽象:
public interface ISmtpClient
{
void Send(MailMessage msg, string host, int port, SmtpDeliveryMethod deliveryMethod);
}
public interface IMailMessageComposer
{
MailMessage Create(string noReplyEmailAddress, string emailAddress, string subject, string body, bool isHtml);
}
使用您的逻辑创建非常简单的实现:
public class MySmtpClient : ISmtpClient
{
public void Send(MailMessage msg, string host, int port, SmtpDeliveryMethod deliveryMethod)
{
using (var client = new SmtpClient())
{
client.Host = host;
client.Port = port;
client.DeliveryMethod = deliveryMethod;
client.Send(msg);
}
}
}
public class MailMessageComposer : IMailMessageComposer
{
public MailMessage Create(string noReplyEmailAddress, string emailAddress, string subject, string body, bool isHtml)
{
return new MailMessage(noReplyEmailAddress, emailAddress)
{
Subject = subject,
Body = body,
IsBodyHtml = isHtml
};
}
}
然后将这些依赖项注入负责发送电子邮件的class:
public class EmailService
{
private readonly ISmtpClient _smtpClient;
private readonly IMailMessageComposer _mailMessageComposer;
public EmailService(ISmtpClient smtpClient, IMailMessageComposer mailMessageComposer)
{
_smtpClient = smtpClient;
_mailMessageComposer = mailMessageComposer;
}
public void SendEmail(string emailAddress, string subject, string body)
{
var message = _mailMessageComposer.Create(NoReplyEmailAddress, emailAddress, subject, body, true);
_smtpClient.Send(message, SmtpHost, SmtpPort, SmtpDeliveryMethod.Network);
}
}
现在您可以分别测试 SmtpClient 和 MailMessage。
测试:
public void Create_MailMessage()
{
var mailComposer = new MailMessageComposer();
var mailMessage = mailComposer.Create("noReply@example.com", "email@example.com", "subject", "body", true);
Assert.Equal("noReply@example.com", mailMessage.Subject);
Assert.Equal("body", mailMessage.Body);
//etc.
}