2017-02-16 4 views
1

test() 메서드를 실행하기 전에 여러 호출을 수행해야합니다. 완료 블록이 있는데 waitForExpectations()을 사용하고 있습니다. 하나 이상의 비동기 호출이 있으므로 카운터를 사용하고 있습니다. 카운터 번호가 통화 수에 도달 한 경우에만 expectation.fulfill()이 발생하도록했습니다.XCTestCase의 setUp()에서 여러 비동기 호출을 기다립니다.

override func setUp() { 
    super.setUp() 

    let exp = expectation(description: "waitForSetUp") 
    var counter = 0 

    // Issue an async request 
    self.addEventToCalendar(title: "Test1", description: "Description test1", startDate: NSDate().addingTimeInterval(-36000), endDate: NSDate()){(success, error) in 
     if (success) && (error == nil) { 
      counter = counter + 1 
      if(counter == 2){exp.fulfill()} 
     } 
    } 

    self.addEventToCalendar(title: "Test2", description: "Description test2", startDate: NSDate(), endDate: NSDate().addingTimeInterval(36000)){(success, error) in 
     if (success) && (error == nil) { 
      counter = counter + 1 
      if(counter == 2){exp.fulfill()} 
     } 
    } 

    waitForExpectations(timeout: 40, handler: nil)   
} 

이 구성은 작동하지 않습니다. test() 메서드는 때때로 호출이 반환되기 전에 실행됩니다 (항상 그런 것은 아닙니다).

setUp() 여러 비동기 호출이 반환 될 때까지 대기하려면 어떻게해야합니까?

+0

핸들러를 구현하고 가능한 오류를 확인하려고 했습니까? – user3581248

답변

1

나는 비슷한 경우가 있습니다. 필자가 끝내는 해결책은 필자의 전제 조건에 대한 기대치를 추가하고 기대치에 대한 타임 아웃을 합리적인 값으로 설정하는 여러 함수를 호출하는 것입니다. 완성 된 핸들러에서 나는 셋업 알고리즘의 다음 단계를 시작했다. 모든 예비 단계가 끝나면 실제 테스트 논리를 시작합니다.

Apple 문서에 link을 첨부하십시오.

편집 :

class CommonTests: XCTestCase { 
    var validate: XCTestExpectation? = nil 

    func testMytest() {   
     validate(completion: { 
     loadSomeStuff(completion: { (list: [Stuff]?) in 
      // actual test 
     } 
     }) 
    } 

    func validate(completion: @escaping()->()) { 
     self.validateExpectation = self.expectation(description: "Setup") 
     // async operation can be fired here 
     // or if already started from somewhere else just wait for it to complete 


     self.waitForExpectations(timeout: 60) { (error: Error?) in 
      XCTAssert((error == nil), error?.localizedDescription ?? "Failed with unknown error") 
      completion() 
     } 
    } 

    func validateAsyncCompleted() { 
     self.validateExpectation?.fulfill() 
    } 

    func loadStuff(completion: @escaping ([Stuff]?)->()) { 

     // possible place for assertion or some other checks 

     let expectation = self.expectation(description: "loading") 
     DispatchQueue.global().async { 

     let result: [Stuff]? = nil 
     // load operation 

     expectation.fulfill() 
     completion(result) 
     } 

     self.waitForExpectations(timeout: 90) { (error: Error?) in 
     XCTAssert((error == nil), error?.localizedDescription ?? "load - failed with unknown error") 
     } 
    } 
} 

참고 : 아래 예제 코드를 참조하십시오 필요한 경우가 다른 함수에서 성취 될 수 있도록 기대에 대한이 접근법은 첫 번째 기대는 변수에 저장되어있다가, 다른 하나는 함수 본문에서 로컬로 생성되고 종료에서 수행됩니다.