waitForExpectationsWithTimeout 崩溃

waitForExpectationsWithTimeout crashes

我正在尝试使用 XCTest 测试异步请求,因此使用 expectationWithDescription:。 然而,当调用 waitForExpectationsWithTimeout 时,它甚至没有等待超时就立即崩溃。 我什至尝试在排除超时问题后立即执行 fulfill 操作,但这并没有改变任何事情;这是我的职能:

func testTrafficRefresh(){
    let expectation = expectationWithDescription("refreshed")
    waitForExpectationsWithTimeout(10, handler:nil)
    traffic.trafficRefresh {[weak self] () -> Void in
        let coming=inArrivoHDDetailViewController.sharedDetailController().activeTransit
        let buses=self!.traffic.arrivingBuses
        let count=buses.count
        XCTAssert(count==0 && coming==0, "No buses and active transit")
        XCTAssert(count>0 && coming==1, "Arriving buses and inactive transit")
        expectation.fulfill()   
    }
}

相同的行为发生在其他函数中。如果我取消 waitForExpectationsWithTimeout 操作并保留 expectationWithDescription 操作,它会在函数结束时崩溃。在这两种情况下,崩溃报告如下:

libsystem_kernel.dylib`__pthread_kill:
0x10723227c <+0>:  movl   [=11=]x2000148, %eax
0x107232281 <+5>:  movq   %rcx, %r10
0x107232284 <+8>:  syscall 
0x107232286 <+10>: jae    0x107232290               ; <+20>
0x107232288 <+12>: movq   %rax, %rdi
0x10723228b <+15>: jmp    0x10722dc53               ; cerror_nocancel
0x107232290 <+20>: retq   
0x107232291 <+21>: nop    
0x107232292 <+22>: nop    
0x107232293 <+23>: nop

您可以尝试为处理程序提供实现。根据文档 handler 参数在 waitForExpectationsWithTimeout 标记中不是可选的:

func waitForExpectationsWithTimeout(timeout: NSTimeInterval, handler handlerOrNil: XCWaitCompletionHandler!)

因此您可以尝试提供明确的解包处理程序(即使是空的处理程序也可以):

    waitForExpectationsWithTimeout(10) { error in
        //XCTAssertNil(error, "") this is optional
    }

您也可以尝试关注this post,看看您是否获得更合适的崩溃日志。

看了WWDC14的具体演讲,得出了如下实现:

 func testTrafficRefresh(){
    let expectation = expectationWithDescription("refreshed")
    traffic.trafficRefresh {[weak self] () -> Void in
        let coming=inArrivoHDDetailViewController.sharedDetailController().activeTransit
        let buses=self!.traffic.arrivingBuses
        let count=buses.count
        XCTAssert(((count == 0 && coming==1)||(count>0 && coming==1)), "Transit status \(coming) not corresponding to arriving buses \(count)")
        expectation.fulfill()
    }
    waitForExpectationsWithTimeout(20, handler:nil)
}

它与原来的非常相似,但对于 waitForExpectationsWithTimeout 命令的位置,这似乎是至关重要的。