0

非常によく似た機能を持ついくつかの異なるクラスをテストする必要があります。

それらはすべて異なるインターフェースで注入され、これらのインターフェースにはすべて、このシグネチャを持つ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;
    }

これにアプローチする方法はありますか?

ありがとう

更新:問題の解決策を見つけました。しかし、より「科学的な」答えを得るために、私は当初意図したように、ジェネリックメソッドのソリューションを使用した応答を希望します。ちょっと興味があるんだけど。「承認済みの回答」マークを自分の回答から他の回答に変更します。これにより、別の興味深い解決策が提供されます。

4

1 に答える 1

0

これを理解することはできませんでしたが、すべてのテストクラスの基本クラスを作成し、この基本クラスに、入力に基づいて正しいものを返すメソッドを配置することで回避しました。

次に、テスト自体では、Stubを使用して値を再調整する代わりに、次のようにDo()を使用しました。

基本テストクラス:

protected string TestWithNullEmptyException(string code)
    {
        switch (code)
        {
            case REQ_NULL_CODE:
                return null;
                break;
            case REQ_EMPTY_CODE:
                return String.Empty;
                break;
            case REQ_EXCEPTION:
                throw new Exception("Exception code recieved.");
                break;
            default:
                return "UNDEFINED";
                break;
        }
    }

そして、テストでは:

dbCar
     .Stub(d => d.GetAirVendorNameByCode(Arg<string>.Is.Anything))
     .Do( (Func<string, string>)TestWithNullEmptyException );

そうすれば、各テストケースで繰り返す必要があるのは「スタブ」だけですが、とにかくそれをしなければなりません。

于 2011-02-09T18:35:22.697 に答える