Csharp/C#教程:如何在UnitTest中模拟/伪造SmtpClient?分享


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

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

 using (ShimsContext.Create()) { StubSmtpClient client = new StubSmtpClient(); } 

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

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

 public interface ISmtpClient { void Send(MailMessage mailMessage); } 

然后创建您的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); } } 

在你的测试方法中,你现在可以模拟它并使用像;

 [TestMethod()] public void SendTest() { Mock smtpClient = new Mock(); 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); } 

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

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

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

另一种方法是使用nDumbster :

Install-Package nDumbster

它在内存中运行Smtp服务器,然后您可以validation它。 它将其更多地转变为集成测试,但通常这些值比unit testing更高,因为您要测试SmtpClient使用情况也是正确的。

Teoman shipahi的这个答案的一个版本正确处理了SmtpClient

首先让ISmtpClientinheritanceIDisposable

 public interface ISmtpClient : IDisposable { void Send(MailMessage mailMessage); } 

然后在SmtpClientWrapper类中实现IDisposable

 public class SmtpClientWrapper : ISmtpClient { private bool disposed; private readonly SmtpClient smtpClient; public SmtpClientWrapper(string host, int port) { smtpClient = new SmtpClient(host, port); } ~SmtpClientWrapper() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { smtpClient?.Dispose(); } disposed = true; } } protected void CheckDisposed() { if (disposed) { throw new ObjectDisposedException(nameof(SmtpClientWrapper)); } } public void Send(MailMessage mailMessage) { CheckDisposed(); smtpClient.Send(mailMessage); } } 

对于这个版本的SmtpClientWrapper ,我已经删除了SmtpClient属性,以避免在SmtpClient属性的setter中替换时没有处理SmtpClient对象的问题。

我需要Shim SmtpClient用于不同的目的,但步骤是相同的​​: http : //timscyclingblog.wordpress.com/2014/03/05/detouring-a-constructor-with-microsoft-fakes-dev-coding-tdd/

它包含为SmtpClient创建Shim的步骤以及确保处理所有实例的示例。

上述就是C#学习教程:如何在UnitTest中模拟/伪造SmtpClient?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/987324.html

(0)
上一篇 2021年12月22日
下一篇 2021年12月22日

精彩推荐