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 命令的位置,这似乎是至关重要的。
我正在尝试使用 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 命令的位置,这似乎是至关重要的。