2015-02-15 4 views
0

Я создал следующий класс:OCMock не работает должным образом в iOS?

@implementation BCGlobalConstantBox 

+ (instancetype)sharedInstance { 

    static BCGlobalConstantBox *instance = nil; 
    static dispatch_once_t predicate; 
    dispatch_once(&predicate, ^{ 

     instance = [[self alloc] init]; 
    }); 
    return instance; 
} 

- (NSString *)someMethod { 

    return nil; 
} 

@end 

Затем я добавил OCMock с помощью источников (просто добавили файлы в моем проекте). Я использую его не для тестирования, а как временные данные в обычной задаче отладки.

Следующий код работает:

id goalObj = [BCGlobalConstantBox class]; 
    id mock = [OCMockObject niceMockForClass:goalObj]; 
// id mock = [OCMockObject partialMockForObject:[goalObj sharedInstance]]; 
    NSArray *arr = @[@1, @2, @3]; 
    [[[mock stub] andReturn:@"123"] someMethod]; 
    id obj = [[BCGlobalConstantBox sharedInstance] someMethod]; 

Но если я раскомментировать строку с «макетом» инициализации вместо рабочей единице, то весь код не работает должным образом (объект должен быть равен @ «123»).

Я хочу добавить функциональность для всего класса, а не только для одного объекта. Что неверно в моем коде?

P.S. mockForClass: и niceMockForClass: обе не работаем.

ответ

2

В тесте следующая строка устанавливает заглушку на издеваться:

[[[mock stub] andReturn:@"123"] someMethod]; 

Однако чуть ниже someMethod вызывается для объекта, возвращенного методом sharedInstance класса на BCGGlobalConstantBox и возвращает реальный экземпляр, не макет. Это означает, что заглушка на макете не может выполнять свою работу.

Вы можете сделать эту работу, добавив еще одну заглушку, заглушку для метода sharedInstance класса, так что, что возвращает макет:

[[[mock stub] andReturn:mock] sharedInstance]; 

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

Смежные вопросы