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
클래스 비동기 블록 사용이 도움
어떤 시험에 노력하고있다 : 네트워크 요청 또는 백그라운드 작업 또는 뭔가 다른 결과? 비동기 호출 만 테스트해야하는 경우'''self.service fetchData''' 호출을 스텁하고 즉시 호출을 호출하면 여기서 제공되는''waitForExpectationsWithTimeout'''과 함께 solution을 사용할 수 있습니다. 오래 걸리지 않을거야. – Konstantin
@ Konstantin, 그것은 아무것도, 네트워크 요청, 백그라운드 작업 등 수 있습니다. 그것은 내 질문의 요점이 아닙니다. 큐를 수동으로 큐를 실행시키는 방법을 알고 싶을뿐입니다. 그것이 저의 주요 관심사입니다. –
테스트 함수에서 큐를 생성하고 전달하지 않는 한 가능하지 않다고 생각합니다. 그것은 아마도 당신이 원하는 것이 아닙니다. – Code