1
I dispatch_async 이런 메인 큐에 차단하면

: 단위 테스트단위 테스트에서 dispatch_asyc 함께 큐에 전달 된 블록을 실행

-(void) myTask { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.service fetchData]; 
    }); 
} 

, 전 블록을 수동으로 메인 큐에 전달 할 수 이 같은 메인 루프 실행 : 이제

-(void)testMyTask{ 
    // call function under test 
    [myObj myTask]; 
    // run the main loop manually! 
    [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; 
    // now I can verify the function 'fetchData' in block is called 
    ... 
} 

을, 나는 주요 큐 이상의 의 다른 순차적 대기열에 블록을 파견 다른 유사한 기능을 가지고 :

-(void) myTask2 { 
    dispatch_async(dispatch_queue_create("my.sequential.queue", NULL), ^{ 
     [self.service fetchData]; 
    }); 
} 

단위 테스트에서 어떻게 수동으로 블록을 실행할 수 있습니까?

-(void)testMyTask2{ 
    // call function under test 
    [myObj myTask2]; 
    // How to manually execute the block now? 
} 

=== 내가 테스트를 수행하는 모든 대기를 위해 시간 제한 방식을 좋아하지 않기 때문에 ===

내가 수동으로 실행하려는 이유는 명확히. 대기 시간은 CPU 속도에 따라 다르므로 다른 시스템에서 다를 수 있습니다. 수동으로 대기열에 전달 된 블록을 실행하고 싶습니다 (기본 대기열 테스트 케이스에서와 같은 방식으로). 그런 다음 결과를 확인하십시오. 당신은 당신의 테스트 기능에 큐를 만들 수

-(void) myTask2 { 
    XCTestExpectation *expectation = [self expectationWithDescription:@"catch is called"]; 
    dispatch_async(dispatch_queue_create("my.sequetial.queue", NULL), ^{ 
     [self.serviceClient fetchDataForUserId:self.userId]; 
     [expectation fulfill]; 
    }); 

    [self waitForExpectationsWithTimeout:Timeout handler:^(NSError *error) { 
     //check that your NSError nil or not 
    }]; 
} 

희망 XCTestExpectation 클래스 비동기 블록 사용이 도움

+0

어떤 시험에 노력하고있다 : 네트워크 요청 또는 백그라운드 작업 또는 뭔가 다른 결과? 비동기 호출 만 테스트해야하는 경우'''self.service fetchData''' 호출을 스텁하고 즉시 호출을 호출하면 여기서 제공되는''waitForExpectationsWithTimeout'''과 함께 solution을 사용할 수 있습니다. 오래 걸리지 않을거야. – Konstantin

+0

@ Konstantin, 그것은 아무것도, 네트워크 요청, 백그라운드 작업 등 수 있습니다. 그것은 내 질문의 요점이 아닙니다. 큐를 수동으로 큐를 실행시키는 방법을 알고 싶을뿐입니다. 그것이 저의 주요 관심사입니다. –

+0

테스트 함수에서 큐를 생성하고 전달하지 않는 한 가능하지 않다고 생각합니다. 그것은 아마도 당신이 원하는 것이 아닙니다. – Code

답변

1

을 테스트를 실행에 대한

+0

어디에서 단언합니까? 테스트 함수'dispatch_sync (queue,^{// assertion here?});)는 테스트중인 함수에서'dispatch_async' 호출에 대기열에 포함 된 태스크를 실행하기 위해 동시에 디스패치 한 다음 블록에 어설 션을 대기열에 넣습니다 부품? –

+0

@ Leem.fin 당신은'dispatch_sync' 다음에 그것을합니다. – Code

+0

하지만 테스트에서'dispatch_sync (queue,^{});'의 목적은 테스트중인 함수에서 대기열에 넣어 진 작업의 실행을 기다리는 것입니까? 대답이 '예'라면,'dispatch_sync (queue,^{ASSERT()});가 실행될 다음 작업으로'ASSERT()'를 대기열에 넣을 것이라고 생각할 수 있습니까? 내가 이전 코멘트에서했던 것과 같은 블록? –

0

.

-(void) myTask2:(dispatch_queue_t*)queue { 
    dispatch_async(*queue, ^{ 
     [self.service fetchData]; 
    }); 
} 

-(void)testMyTask2{ 
    dispatch_queue_t queue = dispatch_queue_create("my.sequential.queue", NULL); 
    [myObj myTask2:&queue]; 

    dispatch_sync(queue, ^{ 
    }); 
} 

(그냥 currentRunLoop가 필요하지 않은) 된

+0

그 이유는 정확하게 'waitForExpectationsWithTimeout'을 사용하지 않기 때문에 블록을 수동으로 실행하는 방법을 묻는 이유입니다. 대기 시간을 설정하는 것이 좋지 않습니다. 왜냐하면 다른 시스템에서 대기 시간이 다를 수 있기 때문입니다. 내가 수동으로 대기열을 블록을 실행하게하고, 그 다음에 내가 메인 대기열에 대해했던 것처럼 결과를 확인하고 싶다. –

+0

"OCMock에서 제공 한 waitForExpectationsWithTimeout : Timeout이 마음에 들지 않습니다."라는 문구를 읽으십시오.이 댓글은 절대 잘못된 내용입니다. OCMock은이 메소드를 제공하지 않았고, Apple에서 제공 한'XCTestExpectation' 클래스는 제공하지 않습니다. – iSashok

+0

나는 그것을 어떻게 든 갱신 할 것이다, 나는 시험을하고있는 타임 아웃 방법을 기다리는 것이 싫다. 이유는 같고 대기 시간은 다른 기계에서 예측할 수 없다. –