How to I capture an argument sent to a mock?

旧巷老猫 提交于 2019-12-05 09:12:14
Quentin

If you want to validate your parameter maybe you can do it directly while you are setting your stub with something like :

id mock = [OCMockObject mockForClass:someClass];
NSObject* captureThisArgument;
[[mock expect] foo:[OCMArg checkWithBlock:^(id value){ 
    // Capture argument here...
}]];

Regards, Quentin A

You can stub the call and pass it to a block that verifies it:

NSObject *expected = ...;

id mock = [OCMockObject mockForClass:someClass]
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) {
    NSObject *actual;
    [invocation getArgument:&actual atIndex:2];
    expect(actual).toEqual(expected);   
};
[[[mock stub] andDo:theBlock] foo:[OCMArg any]];

[mock foo:expected];

There's also a callback version of this, but the control flow gets more complex, as you need a state variable that's visible to both your test and the verification callback:

[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument]
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!