2017-04-03 28 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);