すでにコードがあり、それをテストする方法を尋ねている場合は、最初にテストを書いていないので、実際には TDD を行っていません。
ただし、ここにあるのは依存関係です。したがって、TDD アプローチはDependency Injectionを使用することになります。これは、 UnityのようなIoCコンテナーを使用して簡単に行うことができます。
TDD を「適切に」実行する場合、この種のシナリオでは、思考プロセスは次のように実行する必要があります。
- 私はする必要があります
Foo
- このために、(新規または既存の)インターフェースを実装する外部依存関係に依存します
IMyDisposableClass
- したがって、コンストラクターを介して宣言さ
IMyDisposableClass
れているクラスにを挿入しますFoo
次に、失敗する 1 つ (または複数) のテストを記述し、関数本体を記述している時点でのみ、ブロックFoo
を使用する必要があるかどうかを判断します。using
実際には、はい、using
ブロックを使用することをよく知っているかもしれません。しかし、TDD の要点の 1 つは、これを必要とするオブジェクトを使用する必要があることを (テストによって) 証明するまで、それについて心配する必要がないということです。
ブロックを使用する必要があると判断したらusing
、失敗するテストを作成します。たとえば、Rhino MocksDispose
などを使用して、実装するモック オブジェクトで呼び出される期待値を設定しますIMyDisposableClass
。
例 (Rhino Mocks を使用して mock 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());
}
}
IMyDisposableClass
依存関係として注入されたFoo 関数が存在するクラス:
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();
}