4

다음 내가 테스트하려고하는 방법의 일부가 될 때 다음과 같이아이폰 OS - 단위 테스트 Asynchoronous 코드

- (void)configureTableFooterView { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.tableView.tableFooterView = nil; 

     if ([self.parser.resultSet isLastPage]) { 
      return; 
     } 
    }); 
} 

내가 단위 테스트를 작성했습니다 :

- (void)testTableFooterViewConfigurationAfterLastPageLoaded { 

    id mockTableView = OCMClassMock([GMGFlatTableView class]); 

    OCMExpect([mockTableView setTableFooterView:[OCMArg isNil]]); 

    id resultSet = OCMClassMock([GMGResultSetInfo class]); 

    OCMStub([resultSet isLastPage]).andReturn(YES); 

    OCMStub([self.mockParser resultSet]).andReturn(resultSet); 

    id partialMockSUT = OCMPartialMock(self.sut); 

    OCMStub([partialMockSUT tableView]).andReturn(mockTableView); 

    [self.sut configureTableFooterView]; 

    OCMVerifyAllWithDelay(mockTableView, 2.0); 

    //OCMVerifyAllWithDelay(partialMockSUT, 2.0); 
} 

나는 다른이 주 스레드의 dispatch_async 호출에서와 동일한 것을 테스트하는 동일한 클래스에서 테스트합니다. 해당 테스트의 테스트 예상 및 검증 설정이이 테스트와 일치합니다. 테스트가 통과하는 동안 지연된 확인 단계에서 무한 루프에 빠지게됩니다.

흥미롭게도이 1 테스트 만 실행하면 문제가 발생하지 않습니다. 이 테스트가 다른 테스트와 함께 실행될 때만 문제가 표시됩니다.

UPDATE : 이것은 훨씬 더 관련 게시물입니다

In unit test, execute the block passed in queue with dispatch_asyc

. 그러나이 거의 원래의 시험 방법과 동일한 방법으로 실패

- (void)testTableFooterViewConfigurationAfterLastPageLoaded { 

    id mockTableView = OCMClassMock([GMGFlatTableView class]); 

    OCMExpect([mockTableView setTableFooterView:[OCMArg isNil]]); 

    id resultSet = OCMClassMock([GMGResultSetInfo class]); 

    OCMStub([resultSet isLastPage]).andReturn(YES); 

    OCMStub([self.mockParser resultSet]).andReturn(resultSet); 

    id partialMockSUT = OCMPartialMock(self.sut); 

    OCMStub([partialMockSUT tableView]).andReturn(mockTableView); 

    [self.sut configureTableFooterView]; 

    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; 

    OCMVerifyAll(mockTableView); 
} 

NSRunLoop와 라인이 스위트 룸으로 실행할 때 EXC_BAD_ACCESS와 충돌하지만 혼자 잘 실행!

+0

http://stackoverflow.com/questions/18667355/how-to-test-async-method-in-block-using-ocmock을 확인 했습니까? – jcaron

+0

이것은 UI 테스트에 더 적합하다는 것을 알아 두십시오. 단위 테스트가 아닙니다. – Cristik

+0

@Cristik 저는 테스트하지만 테스트 방법은 상당히 독립적이며 단위 테스트를 사용하여 올바르게 작동하는지 확인하려고합니다. UI 테스트는 메서드가 UI 흐름에서 올바르게 호출되는지 확인합니다. 그러나, 문제는 일반적으로 GCD로 일반화 될 수 있으므로 내 질문은 –

답변

1

dispatch_async 주위에 클래스 래퍼를 만들어서 종속성으로 전달할 수 있습니다. 또한 가짜 래퍼를 만들어 테스트에 통과시킬 수 있습니다. 관심이 있으시면 훨씬 더 자세한 설명을 드릴 수 있습니다.

+0

dispatch_async C 함수를 래퍼 클래스로 작성 하시겠습니까? 그렇다면, 나는 그 아이디어를 정말로 좋아하지 않습니다. 또한 현재 테스트 구성은 자체적으로 테스트를 수행하는 한 실제로 작동합니다. 모든 테스트를 동시에 실행하면 실패합니다. 어떻게 작동하는지 나의 이해에 어떤 ​​것을 놓치고있다. –

+0

다음 코드는 단위 테스트가 아니다. 종속성을 가진 코드를 테스트하는 경우 기능 테스트라고하며 실제로 다른 사람과 테스트가 실패하는 이유를 정확히 알지 못합니다.하지만 일반적으로 기능 테스트 때문입니다. –

+0

또한 테이블 뷰를 관리하는 클래스가 디스패치 대기열 및 비동기 코드 실행에 대해 알고 있으므로 단일 책임 원칙을 위반합니다. –