【发布时间】:2014-06-18 14:24:41
【问题描述】:
假设我的生产代码是这样开始的:
public class SmtpSender
{
....
}
public void DoCoolThing()
{
var smtpSender = new SmtpSender("mail.blah.com"....);
smtpSender.Send(...)
}
我脑洞大开,决定使用伪造的 SmtpSender 和依赖注入对这个函数进行单元测试:
public interface ISmtpSender
{
...
}
public class SmtpSender : ISmtpSender
{
...
}
public class FakeSmtpSender : ISmtpSender
{
...
}
public void DoCoolThing(ISmtpSender smtpSender)
{
smtpSender.Send(...)
}
然后我想等等,我所有的生产代码总是想要真正的。那么为什么不将参数设为可选,如果不提供则使用默认的 SmtpSender 填充呢?
public void DoCallThing(ISmtpSender smtpSender = null)
{
smtpSender = smtpSender ?? new SmtpSender("...");
smtpSender.Send(...);
}
这允许单元测试在不影响生产代码的情况下伪造它。
这是一个可接受的依赖注入实现吗?
如果没有,有什么陷阱?
【问题讨论】:
标签: unit-testing interface dependency-injection optional-parameters