OCmock и MKReverseGeocoder

Я хотел бы проверить метод, который использует обратное геокодирование. Что я хотел бы сделать, это:

  • установить геокодер как свойство моего контроллера

  • создать геокодер в методе init

  • вызвать геокодер в методе, который я хочу проверить

  • замени геокодер на макет в моем тесте

Проблема в том, что свойство координат MKReverseGeocoder доступно только для чтения, я могу установить его только в методе конструктора:

[[MKReverseGeocoder alloc] initWithCoordinate:coord]

И, конечно, координаты доступны только в методе, который я хочу проверить..

Кто-нибудь знает, как я мог издеваться над классом MKReverseGeocoder?

Заранее спасибо, Винсент.

1 ответ

Ознакомьтесь с замечательной статьей Мэтта Галлахера о модульном тестировании приложений Какао. Он предоставляет расширение категории для NSObject, которое позволяет заменять экземпляры во время тестирования. Я использовал это, чтобы сделать что-то подобное. Я думаю, что ваш тест будет выглядеть примерно так:

#import "NSObject+SupersequentImplementation.h"

id mockGeocoder = nil;

@implementation MKReverseGeocoder (UnitTests)

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate {
   if (mockGeocoder) {
      // make sure the mock returns the coordinate passed in
      [[[mockGeocoder stub] andReturn:coordinate] coordinate];
      return mockGeocoder;
   }
   return invokeSupersequent(coordinate);
}

@end

...

-(void) testSomething {
   mockGeocoder = [OCMockObject mockForClass:[MKReverseGeocoder class]];
   [[mockGeocoder expect] start];

   // code under test
   [myObject geocodeSomething];

   [mockGeocoder verify];
   // clean up
   mockGeocoder = nil;
}
Другие вопросы по тегам