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 вернуть фиктивный объект.

Другие вопросы по тегам