gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:44:01 25 4
gpt4 key购买 nike

我有一个方法叫做:

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)

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

通常你只会测试你的 mock 是否被调用了 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com