非常に似た機能を持ついくつかの異なるクラスをテストする必要があります。RhinoMocks Mockの一般的な作成
それらの全ては、異なるインターフェースを注射し、そしてすべてのこれらのインタフェースは、このシグネチャを持つ1つ以上の方法有する:
ストリングDoSomething1(文字列)。
テスト対象のクラスの多くはこれらのインターフェイスメソッドを呼び出すため、null、空の文字列を返し、例外をスローする方法をテストする必要があります。私。それだけで一つのクラスだった場合、私はこのテストを持っているでしょう:
//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クラスはほとんどありません。
私はいくつかのジェネリックメソッドを作成することを考えていましたが、これは正しくスタブされたモックを返すことができますが、どのようにこれを行うのか正確には分かりません。
I.e.私は次のようなものを持っています:
T PrepareNullEmptyThrowCorrector<T>(Action<T> action)
{
T mock = MockRepository.GenerateMock<T>();
mock.Stub(with null).Return(null)
///etc.
return mock;
}
どのようにこのアプローチになりますか?
おかげ
UPDATE:は、私は私の問題のいくつかの解決策を見つけました。しかし、より科学的な答えを得るためには、私が最初に意図したように、ジェネリックメソッドの解決策を用いることを好むでしょう。ちょっと興味があるんだけど。私は私の答えから "受け入れられた答え"のマークを、他の興味深い解決策を提供する他のものに変更します。