安装模拟重定向到重载方法

时间:2015-04-28 22:03:21

标签: c# unit-testing moq

我有一个叫做的方法:

1 error found:
File: C:\Users\Hunter\workspace\src\rejomedia.java  [line: 74]
Error: Unhandled exception type java.lang.Exception

和重载的方法

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)测试对象。<​​/ p>

有办法吗?

2 个答案:

答案 0 :(得分:4)

您想要的是在设置

上使用.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. 类/接口的实际具体实现。
  3. 关于第二个注释,如果我是你,我会将其分解为以下一个/部分/全部:

    • 调用类/方法调用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(字符串,字符串,字符串,SmtpServer)实际上发送电子邮件。

    • 可能是端到端的测试(没有嘲讽)这一切都有效。

答案 1 :(得分:0)

最简单的

mailServiceMock.Setup(m => m.SendMail(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<SmtpClient>()));

如果你愿意,可以使用回调/回传法。