stub method with block of code as parameter with OCMock
Asked Answered
A

1

5

Is there a way to stub method, that takes block as it's parameter? For example mehod:

- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
Animadvert answered 28/5, 2012 at 8:48 Comment(0)
D
6

Yes. The easiest way would be to accept anything:

id mockGeocoder = [OCMockObject mockForClass:[CLGeocoder class]];
[[mockGeocoder stub] reverseGeocodeLocation:[OCMOCK_ANY] completionHandler:[OCMOCK_ANY]];

It gets a bit trickier if you want to verify a particular block is passed in. One option is to make your completion handler a property of your class, initialize it when you initialize your class, and have the test match it directly:

// in your class
@property(copy)CLGeocodeCompletionHandler completionHandler;

// in your class's init method
self.completionHandler = ^(NSArray *placemark, NSError *error) {
    //
}

// using the completion handler
[geocoder reverseGeocodeLocation:location completionHandler:self.completionHandler];

// the test
id mockGeocoder = [OCMockObject mockForClass:[CLGeocoder class]];
[[mockGeocoder stub] reverseGeocodeLocation:[OCMOCK_ANY] completionHandler:yourClass.completionHandler];
Dennet answered 29/5, 2012 at 17:54 Comment(2)
This will ensure that the stub method is called, but won't actually do anything with the block passed in, correct? Is there any way to do anything with the block parameter, specifically run it? I have a very similar scenario, but I want my mock object to run the block passed in to complete the test.Knot
What's the version 3 answer?Andry

© 2022 - 2024 — McMap. All rights reserved.