Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to I capture an argument sent to a mock?

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?

like image 979
Dr Joe Avatar asked Apr 24 '12 06:04

Dr Joe


2 Answers

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

like image 87
Quentin Avatar answered Oct 12 '22 23:10

Quentin


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]
like image 43
Christopher Pickslay Avatar answered Oct 13 '22 00:10

Christopher Pickslay