我有一个方法叫做:
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
不是拼写错误。
这将是:
- 相同的模拟实例(例如
mailServiceMock.Object
)如果var mailServiceMock = new Mock<ParentClassNotInterface>{ CallsBase = true }
。这当然意味着您的方法必须是虚拟的。 - 类/接口(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/