Search code examples
iosblockstubocmock

stub method with block of code as parameter with OCMock


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

- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

Solution

  • 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];