2016-03-23 14 views
1

У меня есть два класса.Проверить, вызван ли метод из другого объекта OCMock

Объект 1:

- (void) methodA { 
    ObjectB objectB = [[ObjectB alloc] init]; 
    [objectB methodB]; 
} 

И Object 2:

- (void) methodB { 
    // Does something 
} 

Использование OCMock, как я могу проверить, что methodA звонки methodB? Я устанавливаю испытание вверх, как следующее:

id mock = OCMClassMock([Object2 class]); 
OCMStub([mock methodB).andReturn(nil); 

[self.object1 methodA]; 
OCMVerify([mock methodB]); 

Класс тест тестирует object1, но я хотел бы, чтобы убедиться, что он вызывает метод Object2. При выполнении этого теста, я получаю неисправное сообщение:

Method methodB was not invoked. 

Я все еще очень новый для издевается/окурков. Вполне возможно, что я неправильно структурирую тест. Издевательство меня немного смущает, потому что я тестирую Object1, но пытаюсь проверить что-то на Object2.

Я правильно понял, когда настраиваю этот тест? Если нет, как я должен к этому подойти?

ответ

0

Вы должны убедиться (как-то), что Object1 использует макет, а не свежий экземпляр ObjectB. Обычный подход для этого - инъекция зависимостей, т.е. Объект1 имеет зависимость от Object2, но вместо Object1, создающего экземпляр Object2, экземпляр Object2 устанавливается извне (впрыскивается). В Интернете есть огромное количество материала.

С OCMock вы можете взломать свой путь по этому пути. Однако это не рекомендуется. Вы можете заменить alloc/init на new, затем заглушите метод класса new, чтобы вернуть макет. Таким образом, Object1 будет использовать макет, даже не зная об этом. Он все равно «подумает», что он выделил новый экземпляр Object2.

id mock = OCMClassMock([Object2 class]); 
OCMStub([mock new]).andReturn(mock); 
OCMStub([mock methodB).andReturn(nil); 

[self.object1 methodA]; 
OCMVerify([mock methodB]); 

Об этом говорится в справочной документации в 9.3. Методы stubbing, которые создают объекты.