2012-06-29 3 views
3

В моем XCode проекта у меня есть:iOS Единичное тестирование частных мошеннических объектов?

  • контроллер
  • (Singleton) databaseController

databaseController конкретизируется в классе контроллера.

Как заменить этот databaseController макетным объектом, чтобы проверить правильность функционирования класса контроллера, не завися от фактического контроллера базы данных?

Примечания:
- OCUnit используется для модульных испытаний.
- OCMock используется для создания объектов Mock.

Бонусный вопрос: что, если в базе данныхController не было ни одного?

+0

Я думаю, что ваше «что, если контрольный элемент базы данных не был синглом», слишком неопределенный вопрос, не зная больше о требованиях вашего приложения. –

ответ

2

Это подход, который я принимал. В вашем одноточечноге:

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 в моем базовом классе модульных тестов, поэтому он автоматически возникает после каждого теста.

В качестве альтернативы, вы можете create a category in your unit tests that overrides sharedInstance to return a mock object.

+0

Это работает для объекта Singleton. Я все еще озадачен макетными объектами в целом, но я попытаюсь разобраться в этом сам. Thx за помощь! –

+0

Возможно, было бы полезно ознакомиться с Injection Dependency. Одной из основных причин, по которым возникла модель, было то, что люди пытались использовать макеты для тестирования и столкнулись с конкретной проблемой, с которой вы столкнулись. И, да, ответ таков: не устанавливайте контроллер базы данных в контроллере, чтобы можно было установить, какой контроллер базы данных использовать. –