我正在尝试使用Xcode中的单元测试来测试一些异步代码,但是我得到了一个被阻塞的主线程。
问题是正在测试的一些代码期望从iOS类(AVFoundation)接收回调。但是,似乎AVFoundation类只会在主线程上回调。
问题是,如果我正在进行异步单元测试,那么测试实际上会在等待时阻塞主线程,因此永远不会发送回调。
我很确定这是问题所在。有没有办法从另一个线程运行测试或有一个不阻塞主线程的XCTWaiter?
编辑: 看一下这些文档之后,看起来最好的方法是在后台线程上运行整个测试用例。但是,在我当前的项目中,测试都是自动设置的。我想知道是否有人知道如何设置测试用例/手动运行。这样我就可以在另一个线程上运行它。
答案 0 :(得分:3)
考虑@BetterLateThanNever的答案。这是我如何使用主线程中的回调测试代码的代码段。
func test() {
let expectation = XCTestExpectation(description: "Test")
DispatchQueue.global(qos: .default).async {
...
...
let myObj = MyObj()
myObj.runSomethingMayWaitForMainThread()
...
...
XCTAssert(myObj.result)
expectation.fulfill()
}
wait(for: [expectation], timeout: 50.0)
}
答案 1 :(得分:0)
这已经迟了一年多了,所以可能不再相关了,但是我意识到XCTestExpectation解决了这个问题(不确定在您发布问题时是否可用),因此遇到了这个问题。
等待期望不会阻塞主线程,并且允许异步分派到主线程的其他工作按预期进行。希望这会有所帮助