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;
}