Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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# 如何使用moq模拟新实例_C#_Unit Testing_Moq - Fatal编程技术网

C# 如何使用moq模拟新实例

C# 如何使用moq模拟新实例,c#,unit-testing,moq,C#,Unit Testing,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;

我想通过模拟
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));
}
public void testsendmail()
{
Mock mailMessageMock=新建Mock();
MailMessage=(MailMessage)mailMessageMock.Setup(m=>newmailmessage()).Returns(mailMessageMock.Object);
Mock smtpClientMock=新建Mock();
设置(s=>new-SmtpClient())。返回(smtpClientMock.Object);
EmailService EmailService=新的EmailService();
emailService.SendEmail(“tester@gmail.com“,”测试邮件“,”内容“);
mailMessageMock.Verify(m=>m.Subject);
mailMessageMock.Verify(m=>m.Body);
验证(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);
Mock-mailMessageMock=new-Mock();
MailMessage=(MailMessage)mailMessageMock.Setup(m=>newmailmessage()).Returns(mailMessageMock.Object);
Mock smtpClientMock=新建Mock();
设置(s=>new-SmtpClient())。返回(smtpClientMock.Object);
EmailService EmailService=新的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
        };
    }
}
然后将这些依赖项注入负责发送电子邮件的类:

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.
}

你能详细解释一下“不起作用”吗?我们怎么知道你说的“不起作用”是什么意思?你想让我们猜吗?如果他们是新加入这个方法的,你就不能模仿他们。它们必须作为依赖项注入,或者作为可以模拟的虚拟方法拆分。我这里有一些指导:我很抱歉没有弄清楚“不工作”这个词。我对c#world很陌生,我主要关心/问题是这个词在c#world中有用吗?在java中,有一种叫做powermock的东西可以帮助实现这一点。所以我认为c#中肯定也有一些东西,所以我没有详细说明如何测试MailMessageComposer和MySmtpClient?嗨,Pawel,这里我们正在测试新创建或模拟的类(MailMessageComposer和MySmtpClient),但是如何使用模拟对象/数据测试确切的EmailService类呢?请解释如何测试EmailService类的SendEmail方法,而不是MySmtpClient。