在创建方法时,是否应该将在该方法中实例化的每个对象都作为参数传入,以便可以在我们的单元测试中模拟这些对象?
我们这里有很多方法没有相关的单元测试和回顾性地编写测试;我们发现在这些方法中实例化了相当多的对象。
我们的选择之一是将我们当前的方法重构为更多类似单元的方法,并减少每个方法的职责数量。这可能是一个相当漫长的过程,但肯定会在 future 给我们带来很大的好处。
你怎么看?所有在方法中实例化的对象都应该作为参数传入吗?
最佳答案
也许不是所有的对象,但是你注入(inject)到你的单元中的对象越多,你的关注点分离就越好,所以我肯定会建议你朝着这个方向前进。
您不必将所有对象作为方法参数传递。通过构造函数注入(inject)将协作者注入(inject)类通常是更好的设计。这可以使您的界面保持干净,而您的实现可以导入它需要的协作者。
假设您的原始实现如下所示:
public class Foo
{
public Ploeh DoStuff(Fnaah f)
{
var bar = new Bar();
return bar.DoIt(f);
}
}
这可以更改为如下所示:
public class Foo
{
private readonly IBar bar;
public Foo(IBar bar)
{
this.bar = bar;
}
public Ploeh DoStuff(Fnaah f)
{
return this.bar.DoIt(f);
}
}
请注意,我更改了
bar
从 Bar 的实例到 IBar 的实例,从而将 Foo 与 IBar 的具体实现解耦。这样的重构倾向于使您的单元测试更易于编写和维护,因为您现在可以独立地改变 Foo 和 Bar 的实现。
关于unit-testing - 执行 TDD 时要模拟哪些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1661628/