2

単体テスト用のオブジェクトをモックするためにモックフレームワークを使用するのは初めてです。私は現在RhinoMocksを使用していますが、見つからないことを実行する方法があると思います。これがLinqPadプログラムです(C#プログラムクエリにコピーして貼り付けるだけで機能します)。これは私がやろうとしていることを示しています。

public interface MyTest{
    int A(int i);
    string B(int i);
}

/// This is an actual class that is a black box to me.
public class ActualClass : MyTest {
    public int A(int i){
        // Does some work
        return ++i;
    }

    public string B(int i){
        return A(i).ToString();
    }
}

/// I'd like to create a mocked class that uses an instance of the actual class 
/// to provide all of the implementations for the interface except for a single method
/// where I can check the parameter values, and provide my own return value, 
/// or just call the actual class
public class MockedClass : MyTest {

    private ActualClass _actual;
    public MockedClass(ActualClass actual){
        _actual = actual;
    }
    public int A(int i){
        if(i == 1){
            return 10;
        }else{
            return _actual.A(i);
        }
    }

    public string B(int i){
        return _actual.B(i);
    }
}

void Main()
{
    var mock = new MockedClass(new ActualClass());
    mock.A(0).Dump();
    mock.A(1).Dump();
    mock.A(2).Dump();
    mock.B(0).Dump();
    mock.B(1).Dump();
    mock.B(2).Dump();
}

結果:

1
10
3
1
2
3

ユニットテストのためにこれをモックアウトするにはどうすればよいですか。ある種の依存性注入が必要ですか?

4

1 に答える 1

1

はい、渡されたパラメータに基づいてモックオブジェクトの戻り値を変更できます。実際の依存関係とモックされた依存関係を混在させるアプローチは取りません。実際の依存関係のバグが忍び寄る機会が多すぎます。あなたのテストに。

これは、モックされたメソッドの入力引数を調べ、それに応じて戻り値を設定するMyTestインターフェイスで使用できる例です。

var mock = MockRepository.GenerateStub<MyTest>();
mock.Stub(m => m.A(Arg<int>.Is.Anything))
    .Return(99)
    .WhenCalled(mi =>
                    {
                        var arg = Convert.ToInt32(mi.Arguments[0]);
                        switch (arg)
                        {
                            case 0:
                                mi.ReturnValue = 10;
                                break;
                            case 1:
                                mi.ReturnValue = 20;
                                break;
                            case 2:
                                mi.ReturnValue = 30;
                                break;
                            default:
                                mi.ReturnValue = -1;
                                break;
                        }
                    });

値を返すメソッドをスタブ化する場合、Rhino.Mocksでは、スローされる例外を定義するか、戻り値を定義する必要があるため、「Return(99)」が必要であることに注意してください。戻り値は使用しませんが(WhenCalledハンドラー内に独自の値を提供するため)、定義する必要があります。そうしないと、Rhino.Mocksはスタブが最初に呼び出されたときに例外をスローします。

于 2012-08-08T17:51:43.017 に答える