2014-02-10 3 views
1

Я изучаю OCMock в iOS. Кто-нибудь дайте мне знать, в чем разница между методом «niceMockForClass» «partialMockForObject» и «mockForClass». Как и когда использовать все три. Я создал собственный класс с именем «CustomClass». Он имеет метод «verifySetUp». Теперь мне нужно проверить это?Разница между «NICE» «PARTIAL» и «MOCK» в OCMock ios7

-(void)testVerifyMethod { 
    CustomClass *cc = [[CustomClass alloc] init]; 
    id mock = [OCMockObject partialMockForObject:cc]; 
    [[mock stub] verifySetUp]; 
    [mock verify]; 
} 

При изменении partialMockForObject к niceMockForClass или mockForClass тестирует метод успешно. Теперь я просто хочу, когда и как использовать все три.

Как создать макет для подключения в OCMock и как его использовать?

ответ

9

Все эти функции достаточно четко задокументированы на OCMock website. Нет ничего особенного в том, чтобы насмехаться над iOS7, а не с любым другим кодом Objective-C. Прежде чем вы будете беспокоиться о различии между этими различными способами издевательств, вы можете подумать, почему вы хотите вообще насмехаться.

Вы хотите протестировать свой класс и, в частности, метод под названием «verifySetUp». Спросите себя, что делает этот метод? Какой вклад он принимает и каков ожидаемый результат, когда он будет завершен? В своих тестах вызовите этот метод напрямую и после этого утвердите, что произойдет то, что вы хотите. Посмотрите на STAssert или XCTAssert, чтобы сделать утверждения о ваших ожиданиях.

Mocking позволяет вам отключать функциональность за пределами тестируемого устройства. Предположим, что метод, который вы тестируете, вызывает вызов другого метода. Возможно, вы хотите только проверить, вызван ли этот метод, вы можете подделать вызов метода для возврата выбранных вами данных или просто хотите, чтобы этот метод не выполнялся, потому что он не имеет отношения к тесту. В этих случаях вы можете рассмотреть возможность использования mocks.

документация охватывает это хорошо, но в целом вы используете partialMocks, когда вы хотите, чтобы дразнить некоторые методы объекта, но есть другие используют свою первоначальную реализацию, objectMocks, когда вы заботитесь о каждом взаимодействии с издевались объекта, и niceMocks, когда вам нужно издеваться над определенной функциональностью объекта, но они хотят иметь другие вызовы для объекта, ничего не делать, но не подводить.

Наконец, я еще не знаю, что делает 'verifySetUp', но его название предполагает, что оно само является тестом. Если ваше намерение - это покрытие для тестирования записи для метода, который выполняет некоторую «настройку», вы можете захотеть вызвать свой метод настройки непосредственно в своем тесте.

Пример:

- (void)test_setUp_shouldStartEngine_andSetWidgetReadyStateToYes 
{ 
    // Set up a mock to verify a method will be called by our method under test. 
    id engineMock = [OCMock niceMockForClass:Engine.class]; 
    [[engineMock expect] start]; 

    // Create a real object that will be manipulated by our method under test. 
    Widget *widget = [Widget new]; 

    // Do the work 
    [AppController setUpEngine:engineMock widget:widget]; 

    // Verify the widget is ready 
    XCTAssertTrue(widget.ready, @"Widget not ready"); 

    // Verify engine's start method was called 
    [engineMock verify]; 
} 

Я надеюсь, что это помогает. Счастливое модульное тестирование; это отличный способ убедиться, что ваш код делает то, что вы намеревались сделать!

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