6

別のメソッドを正確に4回呼び出すメソッドがあり、そのたびに異なるパラメーターを使用します。メソッドが呼び出されるのをチェックするために、4つの異なる単体テストケースを作成して、呼び出しごとに特定の値を指定することを考えました。

これが私のメソッドの外観です。

public void MainMethod()
{
    IServiceProvider serviceProvider = GetServiceProvider();

    string value1 = GetValueFromStorage("SomeArg1");
    // Call AnotherMethod
    serviceProvider.AnotherMethod(value1);

    string value2 = GetValueFromStorage("SomeArg2");
    // Call AnotherMethod
    serviceProvider.AnotherMethod(value2);

    string value3 = GetValueFromStorage("SomeArg3");
    // Call AnotherMethod
    serviceProvider.AnotherMethod(value3);

    string value4 = GetValueFromStorage("SomeArg4");
    // Call AnotherMethod
    serviceProvider.AnotherMethod(value4);
}

そして、これが私のテスト方法です:

public void TestMainMethod()
{
    // Stub storage
    IDataStorage dataStorage = MockRepository.GenerateStub<IDataStorage>();

    // Stub serviceProvider
    IServiceProvider dataStorage = 
         MockRepository.GenerateStub<IServiceProvider>();

    // stub for SomeArg1
    dataStorage.Stub(x => x.GetValueFromStorage(null)
                           .IgnoreArguments().Return("Value1"))
                           .Repeat.Once();

    // stub for SomeArg2
    dataStorage.Stub(x => x.GetValueFromStorage(null)
                           .IgnoreArguments().Return("Value2"))
                           .Repeat.Once();

    // stub for SomeArg3
    dataStorage.Stub(x => x.GetValueFromStorage(null).IgnoreArguments()
                           .Return("Value3")).Repeat.Once();

    // stub for SomeArg4
    dataStorage.Stub(x => x.GetValueFromStorage(null).IgnoreArguments()
                           .Return("Value4")).Repeat.Once();

   // call MainMethod
   MainMethod();

   // Assert that third call is called with "Value3"
   serviceProvider.AssertWasCalled(x => x.AnotherMethod("Value3"));
}

これは、他の呼び出しを無視して、3番目の呼び出しが特定の引数(または、さらに言えば、シーケンス内の他の呼び出し)で呼び出されていることを確認することはできないようです。「AssertWasCalled」を4回呼び出して、個々の引数を順番に確認する必要があるようです。では、どうすればこれを達成できますか?それとも私はここで何かが欠けていますか?

4

2 に答える 2

3

使えると思いますGetArgumentsForCallsMadeOn(Action<T>)。長い間使用してきましたが、各呼び出しの呼び出しパラメーターであるオブジェクトの配列を含むリストが表示されます。

于 2013-01-03T21:27:06.310 に答える
0

RhinoMocksがMoqのコールバック構文のようなものをサポートしている場合は、IServiceProvider.AnotherMethodのコールバック(または同等のもの)を実装し、そのコールバックで、後で検査するためにAnotherMethodのパラメーターをリストに入れることができます。Moqでこのようなもの:

var anotherMethodParams = new List<string>();
var serviceProvider = new Mock<IServiceProvider>();

//Setup in Moq seems to be somewhat analogous to Stub in RhinoMocks
serviceProvider.Setup(sp => sp.AnotherMethod(It.IsAny<string>()))
               .Callback((string s) => { anotherMethodParams.Add(s); }));

var x = GetTheObjectThatWillCallServiceProviderAnotherMethod();
x.GetValueFromStorage("Value1");
x.GetValueFromStorage("Value2");
x.GetValueFromStorage("Value3");

//Assert that the parameter to the second call of AnotherMethod is as expected.
Assert.AreEqual("Value2", anotherMethodParams[1]);

Moqの例で申し訳ありませんが、それは私がよく知っていることです。

于 2013-01-03T22:09:17.667 に答える