2014-02-10 8 views
1

OCMock을 iOS에서 배우고 있습니다. "niceMockForClass"와 "mockForClass"메소드의 차이점을 알려주세요. 어떻게 그리고 언제 3 가지를 모두 사용합니까? "CustomClass"라는 사용자 정의 클래스를 만들었습니다. 그것은 "verifySetUp"메소드를 가지고 있습니다. 자, 이걸 시험해 볼 필요가 있니?OCMock ios7의 "NICE" "PARTIAL"과 "MOCK"의 차이점

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

partialMockForObject를 niceMockForClass 또는 mockForClass로 변경하면 메서드가 성공적으로 테스트됩니다. 이제는 세 가지를 모두 사용하는시기와 방법을 원합니다.

OCMock에서 연결을위한 모의 (Mock)을 만드는 방법과 어떻게 사용할 수 있습니까?

답변

9

이러한 기능은 모두 OCMock website에 매우 명확하게 설명되어 있습니다. 다른 Objective-C 코드와 달리 iOS7 조롱에 특별한 것은 없습니다. 이러한 다양한 조롱 방법의 차이에 대해 걱정하기 전에 왜 조롱하고 싶은지 고려해 볼 수 있습니다.

클래스를 테스트하고 특히 "verifySetUp"라는 메서드를 테스트하려고합니다. 그 방법은 무엇을합니까? 어떤 입력이 받아 들여지며 완료 될 때 예상되는 결과는 무엇입니까? 테스트에서이 메서드를 직접 호출하고 나중에 원하는 결과가 발생한다고 주장합니다. 기대에 대한 주장을하려면 STAssert 또는 XCTAssert을보십시오.

모킹을 사용하면 테스트중인 장치 이상으로 기능을 스텁 아웃 할 수 있습니다. 테스트중인 메소드가 다른 메소드를 호출한다고 가정하십시오. 이 메소드가 호출되었는지 확인하거나, 메소드 호출을 위조하여 원하는 데이터를 리턴하거나, 테스트와 관련이 없기 때문에 메소드가 실행되지 않도록 할 수 있습니다. 이 경우 모의 객체 사용을 고려할 수 있습니다. 당신이 필요로 할 때

이 문서는 이것을 잘 다루고 있지만,이 객체의 메소드의 일부를 조롱하고자하지만 당신은 조롱 객체와의 모든 상호 작용에 대해 신경 때 다른 사람들이 원래 구현, objectMocks를 사용할 때 일반적으로는 partialMocks를 사용하고 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]; 
} 

도움이 되었기를 바랍니다. 행복한 단위 테스트; 코드가 의도 한대로 작동하는지 확인하는 좋은 방법입니다!