OCmock и MKReverseGeocoder - PullRequest
       8

OCmock и MKReverseGeocoder

0 голосов
/ 04 мая 2010

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

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

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

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

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

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

[[MKReverseGeocoder alloc] initWithCoordinate:coord]

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

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

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

1 Ответ

0 голосов
/ 07 мая 2010

Ознакомьтесь с Отличная статья Мэтта Галлахера о модульном тестировании приложений какао Он предоставляет расширение категории для 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;
}
...