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):
// 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)
| 归档时间: |
|
| 查看次数: |
916 次 |
| 最近记录: |