如果您已经有了自己的代码并且正在询问如何对其进行测试,那么您就不会先编写测试......所以并不是真的在做 TDD。
但是,您在这里拥有的是依赖项。所以 TDD 方法是使用Dependency Injection。使用像Unity这样的IoC容器可以使这更容易。
在“正确”地进行 TDD 时,您的思维过程应该在这种情况下运行如下:
- 我需要做一个
Foo
- 为此,我将依赖一个外部依赖项,该依赖项将实现一个接口(新的或预先存在的)
IMyDisposableClass
- 因此,我将在通过其构造函数声明
IMyDisposableClass
的类中注入一个Foo
然后你会编写一个(或多个)失败的测试,然后你才会在你编写Foo
函数体的地方,并确定你是否需要使用一个using
块。
实际上,您可能很清楚,是的,您将使用一个using
块。但是 TDD 的部分意义在于,在您(通过测试)证明您确实需要使用需要此功能的对象之前,您无需担心这一点。
一旦你确定你需要使用一个using
块,你就会想要编写一个失败的测试——例如使用Rhino Mocks 之类的东西来设置一个期望,该期望Dispose
将在一个实现IMyDisposableClass
.
例如(使用 Rhino Mocks 模拟IMyDisposableClass
)。
[TestFixture]
public class When_calling_Foo
{
[Test]
public void Should_call_Dispose()
{
IMyDisposableClass disposable = MockRepository
.GenerateMock<IMyDisposableClass>();
Stuff stuff = new Stuff(disposable);
stuff.Foo();
disposable.AssertWasCalled(x => x.Dispose());
}
}
Foo 函数所在的类,IMyDisposableClass
作为依赖注入:
public class Stuff
{
private readonly IMyDisposableClass _client;
public Stuff(IMyDisposableClass client)
{
_client = client;
}
public bool Foo()
{
using (_client)
{
return _client.SomeOtherMethod();
}
}
}
还有界面IMyDisposableClass
public interface IMyDisposableClass : IDisposable
{
bool SomeOtherMethod();
}