RhinoMocks - 当一个方法被调用n次时,如何在n-k调用中测试它的参数

时间:2013-01-03 09:12:31

标签: c# unit-testing rhino-mocks

我有一个方法,它正好调用另一个方法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"));
}

似乎我不能忽略其他调用,只是验证第三个调用是使用特定参数调用的(或者是序列中的任何其他调用)。似乎我必须四次调用“AssertWasCalled”并按顺序检查个别参数。 那我怎么能做到这一点?或者我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:3)

我认为您可以使用GetArgumentsForCallsMadeOn(Action<T>)。自从我使用它以来很长一段时间它会给你一个包含一组对象的列表,这些对象是每个调用的调用参数。