2017-04-03 48 views
-2

嘲笑新实例,我想嘲笑都MailMessageSmptpClient如何使用起订量

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); 
     } 
    } 
} 

和我的测试方法测试使用MOQ下面的方法是:

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("[email protected]","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)); 
} 

但它不工作是无论如何要做到这一点?

+2

你可以阐述* “不工作” *? –

+2

我们应该如何知道你的意思是“它不工作”?你想让我们猜测吗? –

+1

如果它们在方法内部出现,你就不能嘲笑它们。它们必须作为依赖项注入,或者作为可以被嘲笑的虚拟方法分离出来。我在这里有一些指导:https://contrivedexample.com/2016/11/26/testing-the-un-testable/ – Crowcoder

回答

5

你的代码无法测试,您可以通过多种方式修复它,例如:

通过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); 
    } 
} 

现在您可以测试SmtpClientMailMessage sepa得非常好。

测试:

public void Create_MailMessage() 
{ 
    var mailComposer = new MailMessageComposer(); 

    var mailMessage = mailComposer.Create("[email protected]", "[email protected]", "subject", "body", true); 

    Assert.Equal("[email protected]", mailMessage.Subject); 
    Assert.Equal("body", mailMessage.Body); 
    //etc. 
} 
+0

如何测试MailMessageComposer和MySmtpClient? – user1188867

0

对于嘲讽MAILMESSAGE和SMTPClient班,他们应该在EmailServiceConstructor注射

public class EmailService { 
    //Constructor 
    public EmailService(MailMessage mailmsgObj, SmtpClient smtpClient) 
    { 

    } 

} 

然后,你可以注入嘲笑类MAILMESSAGE和smtpclient,而在你的测试用例创建EmailServiceObject

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);