如何在UnitTest中模拟/伪造SmtpClient?

use*_*970 13 c# mstest microsoft-fakes

我想用它来伪造System.Net.Mail.SmtpClientMS-Test UnitTest.因此我添加了一个Fizz Assembmly of System.dll.然后我创建一个ShimsContext和一个StubSmtpClient.

using (ShimsContext.Create())
{
   StubSmtpClient client = new StubSmtpClient();               
}
Run Code Online (Sandbox Code Playgroud)

但是我该怎么做呢?最终目标是编写一个Test,它期望使用对象调用send方法MailMessage.

Teo*_*ahi 28

您可以创建一个接口,该接口将公开将从SmtpClient使用的函数

public interface ISmtpClient   
    {
        void Send(MailMessage mailMessage);
    }
Run Code Online (Sandbox Code Playgroud)

然后创建您的Concrete类,它将完成实际工作.

 public class SmtpClientWrapper : ISmtpClient
    {
        public SmtpClient SmtpClient { get; set; }
        public SmtpClientWrapper(string host, int port)
        {
            SmtpClient = new SmtpClient(host, port);
        }
        public void Send(MailMessage mailMessage)
        {
            SmtpClient.Send(mailMessage);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在您的测试方法中,您现在可以模拟它并使用类似;

[TestMethod()]
        public void SendTest()
        {
            Mock<ISmtpClient> smtpClient = new Mock<ISmtpClient>();
            SmtpProvider smtpProvider = new SmtpProvider(smtpClient.Object);
            string @from = "from@from.com";
            string to = "to@to.com";
            bool send = smtpProvider.Send(@from, to);
            Assert.IsTrue(send);
        }
Run Code Online (Sandbox Code Playgroud)

  • 你没有正确处理`SmtpClient` (5认同)
  • 它似乎是被测试的类 (3认同)
  • 您的 SmtpProvider 类来自哪里?我似乎无法解决它。 (2认同)

And*_*bel 7

这不是你问题的真正答案,而是另一种方法:

在app.config中,设置smtp设置以将邮件作为文件传送到本地目录.然后,您可以加载该文件并检查断言部分中的内容.

您将不得不为断言编写更多代码(或者最好创建一些辅助函数),但您不必执行任何影响生产代码的操作.

  • 谢谢,这将是一个解决方案.但我认为MS Fakes这样的方法不再需要了吗? (2认同)

Chr*_*s S 6

另一种选择是使用nDumbster

Install-Package nDumbster

它在内存中运行一个 Smtp 服务器,然后您可以对其进行验证。它更像是一个集成测试,但通常那些比单元测试具有更高的价值,因为您要测试的SmtpClient用法也是正确的。