Does anyone know how to capture an argument sent to an OCMock object?
id mock = [OCMockObject mockForClass:someClass]
NSObject* captureThisArgument;
[[mock expect] foo:<captureThisArgument>]
[mock foo:someThing]
GHAssertEquals[captured, someThing, nil];
How do I go about validating the argument to foo? I'm happy to do it within a block in the mock definition too, but if I could get the object out so that I can assert on feature of it later that would be brilliant.
Is this possible with OCMock?
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]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With