私はユニットテストにかなり複雑な操作を実行するメソッドをしようとしているが、私はそうのようなmockableのインターフェイスでダウンステップの数にその操作を破ることができました:大きな多段階ユニットテストを避けるにはどうすればよいですか?
public class Foo
{
public Foo(IDependency1 dp1, IDependency2 dp2, IDependency3 dp3, IDependency4 dp4)
{
...
}
public IEnumerable<int> Frobnicate(IInput input)
{
var step1 = _dependency1.DoSomeWork(input);
var step2 = _dependency2.DoAdditionalWork(step1);
var step3 = _dependency3.DoEvenMoreWork(step2);
return _dependency4.DoFinalWork(step3);
}
private IDependency1 _dependency1;
private IDependency2 _dependency2;
private IDependency3 _dependency3;
private IDependency4 _dependency4;
}
私はテスト目的でモックを生成するために模擬フレームワーク(Rhino.Mocks)を使用し、ここに示す方法でコードを構造化することはこれまでのところ非常に効果的でした。しかし、どのように私は毎回設定されたすべてのモックオブジェクトとすべての期待を必要とする大きなテストをせずに、このメソッドを単体テストしますか?例:
[Test]
public void FrobnicateDoesSomeWorkAndAdditionalWorkAndEvenMoreWorkAndFinalWorkAndReturnsResult()
{
var fakeInput = ...;
var step1 = ...;
var step2 = ...;
var step3 = ...;
var fakeOutput = ...;
MockRepository mocks = new MockRepository();
var mockDependency1 = mocks.CreateMock<IDependency1>();
Expect.Call(mockDependency1.DoSomeWork(fakeInput)).Return(step1);
var mockDependency2 = mocks.CreateMock<IDependency2>();
Expect.Call(mockDependency2.DoAdditionalWork(step1)).Return(step2);
var mockDependency3 = mocks.CreateMock<IDependency3>();
Expect.Call(mockDependency3.DoEvenMoreWork(step2)).Return(step3);
var mockDependency4 = mocks.CreateMock<IDependency4>();
Expect.Call(mockDependency4.DoFinalWork(step3)).Return(fakeOutput);
mocks.ReplayAll();
Foo foo = new Foo(mockDependency1, mockDependency2, mockDependency3, mockDependency4);
Assert.AreSame(fakeOutput, foo.Frobnicate(fakeInput));
mocks.VerifyAll();
}
これは非常に脆弱です。 Frobnicateの実装を変更すると、このテストは失敗します(ステップ3を2つのサブステップに分解する)。これはオールインワンのものなので、複数の小さなテストを試してみることはできません。それは、将来のメンテナーのための書き込み専用のコードに近づきます。自分自身が来月にどのように動作するのか忘れてしまいました。より良い方法が必要です!右?
この例では、スタブのみをテストしているようですか? –
例は楽しいです。 :)私は、BDDの本質を、詳細を圧倒することなく捉えていると思います。 BDDを学ぶことの問題は、一気にすべてを突き詰めることですから、BDDのすべての良さを伝えるだけではあまり複雑ではない、簡単な例を見つけるのは本当に難しいことです。 –
マイケル、BDDへのポインタありがとう!偉大なもの、私は既にテストスイートを変換しました。 – ciscoheat