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"));
}

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

4

2 回答 2

3

我认为你可以使用GetArgumentsForCallsMadeOn(Action<T>). 自从我使用它以来已经很长时间了,但它为您提供了一个包含对象数组的列表,这些对象是每次调用的调用参数。

于 2013-01-03T21:27:06.310 回答
0

如果 RhinoMocks 支持类似 Moq 的回调语法,您可以为 IServiceProvider.AnotherMethod 实现回调(或等效),并让该回调将 AnotherMethod 的参数放入列表中以供以后检查。起订量是这样的:

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]);

对不起,起订量的例子,但这是我所熟悉的。

于 2013-01-03T22:09:17.667 回答