c# - 设置 Mock 以重定向到重载方法

标签 c# unit-testing moq

我有一个方法叫做:

SendMail(string from, string to, string subject, string smtpServer)

和一个重载方法

SendMail(string from, string to, string subject, SmtpClient smtpClient)

在我的单元测试中,我想设置我的 MailService 模拟,以便在调用方法 SendMail(string, string, string, string) 时我想改为调用重载方法 SendMail(string, string, string, SmtpClient) 并将最后一个参数修改为创建的 SmtpClient 测试对象。<​​/p>

有办法做到这一点吗?

最佳答案

你想要的是使用.Callback(...)在您的设置中

mailServiceMock
  .Setup(m => m.SendMail(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())
  .CallBack((string from, string to, string subject, string server) => mailService.SendMail(from, to, subject, server, SomeSMTPServer)

更重要的是,你为什么要尝试这样做?

通常,您只会测试您的模拟是否被使用(string,stirng,string,string)调用。

然后,当您调用另一个 TestClass/Fixture 时,您将测试它

(string from, string to, string subject, string smtpServer) 

重载,你实际上调用了SmtpServer重载正确的细节。

编辑:评论后

mailService不是拼写错误。

这将是:

  1. 相同的模拟实例(例如 mailServiceMock.Object )如果 var mailServiceMock = new Mock<ParentClassNotInterface>{ CallsBase = true } 。这当然意味着您的方法必须是虚拟的。
  2. 类/接口(interface)的实际具体实现。

关于第二个注释,如果我是你,我会将其分解为以下一个/一些/全部:

  • 调用类/方法调用的单元测试SendServer(string, string, string, string) 。我会使用我在博客上描述的技术:CodePerf[dot]NET - TDD – Mock.Throw Interface Call Verification Technique

  • 当您调用 SendServer(string, string, string, string) 时进行单元测试它调用 SendServer(string, string, string, SmtpServer) SmtpServer 设置正确。

  • SendServer(string, string, string, SmtpServer)` 实际发送电子邮件的集成测试。

  • 可能是一个端到端测试(没有模拟),这一切都有效。

关于c# - 设置 Mock 以重定向到重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29930767/

相关文章:

c# - 我应该为 EF6 实现存储库和工作单元吗?

c# - 如何对代码覆盖率进行单元测试?

c# - 使用最小起订量的扩展方法的单元测试

c# - 如何在另一个 View 的列表中显示用户点击的产品?

c# - IEnumerable Group 按用户指定的动态键列表

c# - MVC3 项目中标准 ninject 和 ninject.web.mvc 之间的区别?

java - 作为重构之前的初始步骤,通过重写私有(private)类变量来测试方法

c# - MsTest 生成的测试是实际的单元测试吗?

c# - 如何使用在方法中具有依赖性的最小起订量对类进行单元测试?

c# - Xamarin Forms 没有为 UITest 设置 StyleId