我应该如何测试从控制器发送电子邮件?

Sim*_*max 6 email asp.net-mvc unit-testing dependency-injection

我开始进行单元测试并尝试做一些TDD.我已经阅读了很多关于这个主题的内容,并写了一些测试.我只是想知道以下是否是正确的方法.

我想在我的网站上添加通常的"联系我们"设施.你知道的事情,用户用他们的电子邮件地址填写表格,输入一条简短的信息,然后按一个按钮发回表格.

模型绑定器执行它们的操作,我的操作方法接受发布的数据作为模型.然后,操作方法将解析模型并使用smtp向网站管理员发送电子邮件,让他/她填写有人在其网站上填写联系表单.

现在问题....为了测试这个,我是否正确创建一个接口IMessageService,它有一个方法Send(emailAddress,message)来接受电子邮件地址和消息体.在具体类中实现接口,让该类处理smtp的东西并实际发送邮件.

如果我将接口作为参数添加到我的控制器构造函数中,那么我可以使用DI和IoC将具体类注入控制器.但是在进行单元测试时,我可以创建我的IMessageService的伪造或模拟版本并对其进行断言.

我问的原因是我看过其他人为SmtpClient生成接口然后嘲笑它的例子.真的有必要走那么远,还是我不理解这些东西?

tva*_*son 2

您仍然需要测试调用邮件程序的类。我建议你可能两者都想做一点。我通常创建一个 IMailClient 接口和一个实现该接口的 SmtpClient 包装器。在知道如何构造消息并发送消息的代理类中使用(并注入)接口(它可能有多个可以构造多种不同类型消息的工厂类型方法)。SmtpClient 周围的垫片实际上应该就是这样,因此几乎不需要对其进行单元测试。您可以在测试代理类时模拟您的垫片,并在测试控制器时模拟您的代理类。