Rhino.Mocks:方法调用记录器(又名测试间谍)

Igo*_*ejc 3 c# dependency-injection rhino-mocks mocking

我有一个我想要测试的逻辑,它使用依赖注入接口和一个(或多个)void方法,例如:

interface IMyService
{
    void MethodA (MyComplexObject arg1, int arg2);
}
Run Code Online (Sandbox Code Playgroud)

我想是创建一个存根为此IMyService,将刚刚记录的方法调用MethodA,我会以后还可以访问它作为一个列表,像:

MyComplexObject actualParameter = serviceRecorder
    .GetMethodRecordings("MethodA").GetRecord(10).GetInputParameter(0);
Run Code Online (Sandbox Code Playgroud)

我需要这个来检查某个调用的这个参数的内容并对其进行断言.我知道还有其他的做法(比如设置带有约束的期望调用),但是当你有大量的调用并且你只想在第51个调用时,这似乎更容易编写,例如.

那么在Rhino.Mocks中是否存在某种机制,或者我留给自己的设备(IMyService用记录功能编写虚拟实现)?

注意:(我知道这可能会导致测试变得脆弱,我知道后果).

更新:这是我到目前为止所发现的(部分归功于Mark帮助将此模式命名为Test Spy):

Dar*_*rov 5

// arrange
var myServiceStub = MockRepository.GenerateStub<IMyService>();
var myComplexObj = new MyComplexObject 
{
    SomeProp = "something",
    SomeOtherProp = "something else"
};

// act
myServiceStub.MethodA(myComplexObj, 10);

// assert
myServiceStub.AssertWasCalled(
    x => x.MethodA(
        Arg<MyComplexObject>.Matches(
            arg1 => arg1.SomeProp == "something" &&
                    arg1.SomeOtherProp == "something else"
        ), 
        Arg<int>.Is.Equal(10)
    )
);
Run Code Online (Sandbox Code Playgroud)

备注:不要忘记将界面公开,否则Rhino Mocks将无法创建代理.


更新:

对不起,我没有仔细阅读你的问题.以下是如何获得所需的行为:

var args = myServiceStub.GetArgumentsForCallsMadeOn(
    x => x.MethodA(null, default(int)),
    x => x.IgnoreArguments()
);

var theComplexObjectPassedAtThe51thCall = (MyComlexObject)args[50][0];
// TODO: assert something on this object
Run Code Online (Sandbox Code Playgroud)