非常によく似た機能を持ついくつかの異なるクラスをテストする必要があります。
それらはすべて異なるインターフェースで注入され、これらのインターフェースにはすべて、このシグネチャを持つ1つ以上のメソッドがあります。
文字列DoSomething1(文字列);
テスト対象のクラスの多くはこれらのインターフェイスメソッドを呼び出します。null、空の文字列を返し、例外をスローした場合に、それらがどのように応答するかをテストする必要があります。つまり、クラスが1つしかない場合は、次のテストを行います。
//arrange
CarComponentType carNull = new CarComponentType();
carNull.VendorCode = RESPONSE_NULL_CODE;
CarComponentType carEmpty = new CarComponentType();
carEmpty.VendorCode = RESPONSE_EMPTY_CODE;
CarComponentType carEx = new CarComponentType();
carEx.VendorCode = RESPONSE_EXCEPTION;
ICarDBCorrector dbCar = MockRepository.GenerateMock<ICarDBCorrector>();
dbCar
.Stub(d => d.GetCarVendorByCode(RESPONSE_NULL_CODE))
.Return(null);
dbCar
.Stub(d => d.GetCarVendorByCode(RESPONSE_EMPTY_CODE))
.Return(String.Empty);
dbCar
.Stub(d => dbCar.GetCarVendorByCode(RESPONSE_EXCEPTION))
.Throw(new Exception());
CarComponentCorrector corrector = new CarComponentCorrector(dbCar);
//act
corrector.CorrectComponent(carNull);
corrector.CorrectComponent(carEmpty);
corrector.CorrectComponent(carEx);
//assert
Assert.AreEqual(RESPONSE_NULL_CODE, carNull.VendorName);
Assert.AreEqual(RESPONSE_EMPTY_CODE, carEmpty.VendorName);
Assert.AreEqual(RESPONSE_EXCEPTION, carEx.VendorName);
現在、ICarDBCorrectorにはそのようなメソッドがさらに2つあり、テストコードを複製したくないと思います。
また、同様のIDbXXXインターフェイスを使用して仕事をする他のComponentCorrectorクラスはほとんどありません。
そこで、適切なスタブモックを返して使用できるジェネリックメソッドを作成することを考えていましたが、これを正確に行う方法がわかりません。
つまり、次のようなものが欲しいのです。
T PrepareNullEmptyThrowCorrector<T>(Action<T> action)
{
T mock = MockRepository.GenerateMock<T>();
mock.Stub(with null).Return(null)
///etc.
return mock;
}
これにアプローチする方法はありますか?
ありがとう
更新:問題の解決策を見つけました。しかし、より「科学的な」答えを得るために、私は当初意図したように、ジェネリックメソッドのソリューションを使用した応答を希望します。ちょっと興味があるんだけど。「承認済みの回答」マークを自分の回答から他の回答に変更します。これにより、別の興味深い解決策が提供されます。