iOS-модуль тестирует приватные фиктивные объекты?
В моем проекте XCode у меня есть:
- контроллер
- (Singleton) база данныхКонтроллер
DatabaseController создается в классе контроллера.
Как мне заменить этот databaseController на фиктивный объект, чтобы проверить правильное функционирование класса контроллера, не будучи зависимым от фактического databaseController?
заметки:
- OCUnit используется для модульного тестирования.
- OCMock используется для создания объектов Mock.
Дополнительный вопрос: что, если databaseController не был синглтоном?
1 ответ
Это подход, который я использовал. В твоем синглтоне:
static SomeManager *_sharedInstance = nil;
+(SomeManager *)sharedInstance {
if (_sharedInstance == nil) {
_sharedInstance = [[SomeManager alloc] init];
}
return _sharedInstance;
}
+(void)setSharedInstance:(SomeManager *)instance {
_sharedInstance = instance;
}
Затем в вашем тесте:
-(void)testSomethingThatUsesSingleton {
id mockManager = [OCMockObject mockForClass:[SomeManager class]];
[SomeManager setSharedInstance:mockManager];
[[mockManager expect] something];
[controller doSomething];
[mockManager verify];
[SomeManager setSharedInstance:nil];
}
Не забудьте вернуть синглтон на ноль в конце теста. Я обычно делаю это в tearDown
в моем базовом классе модульных тестов, так что это автоматически происходит после каждого теста.
Кроме того, вы можете создать категорию в ваших модульных тестах, которая переопределяет sharedInstance
вернуть фиктивный объект.