Reputation: 760
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?
Upvotes: 6
Views: 5844
Reputation: 1781
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
Upvotes: 12
Reputation: 17782
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]
Upvotes: 4