【发布时间】:2011-03-09 00:29:45
【问题描述】:
我有一个类 Foo,它使用另一个类 Bar 来做一些事情。
我正在尝试进行测试驱动开发,因此正在为 Foo 编写单元测试以确保它在 Bar 上调用适当的方法,为此我正在使用依赖注入和模拟 Bar(使用 Rhino Mocks) .
例如(在 C# 中):
class Foo
{
private IBar bar= null;
public Foo(IBar bar)
{
this.bar= bar;
}
public void DoSomething()
{
bar.DoIt();
}
}
class FooTests
{
...
void DoSomethingCallsBarsDoItMethod()
{
IBar mockBar= MockRepository.GenerateMock<IBar>();
mockBar.Expect(b=>b.DoIt());
Foo foo= new Foo(mockBar);
foo.DoSomething();
mockBar.VerifyAllExpectations();
}
}
这一切似乎都很好,但我实际上希望 Bar 配置一个特定的参数,并且打算通过 Foo 的构造函数传入这个参数。 例如。 (在 C# 中):
public Foo(int x)
{
this.bar = new Bar(x);
}
我不确定哪种方法可以将其更改为更易于测试。我能想到的一种选择是将 Bar 的初始化移出其构造函数,例如
public Foo (IBar bar, int x)
{
this.bar= bar;
this.bar.Initialize(x);
}
我觉得这让 Bar 更难使用。
我怀疑可能会有某种解决方案涉及使用配置为向 Foo 注入模拟 IBar 的 IoC 容器,并提供对创建的模拟的访问以进行期望验证,但我认为这会使 Foo 变得不必要地复杂。我只使用依赖注入来模拟依赖项进行测试,因此目前不使用 IoC 容器,只是在默认构造函数的链式构造函数调用中构造依赖项(尽管我意识到这会创建更多未经测试的代码)例如
public Foo() :
this(new Bar())
{
}
谁能推荐测试依赖对象构造/初始化的最佳方法?
【问题讨论】:
标签: c# unit-testing dependency-injection mocking