等待主线程的 Xcode 异步单元测试

Dar*_*ell 7 unit-testing ios xctest

我正在尝试使用 Xcode 中的单元测试来测试一些异步代码,但是我遇到了一个阻塞的主线程。

问题是一些被测试的代码期望从 iOS 类 (AVFoundation) 接收回调。但是,似乎 AVFoundation 类只会在主线程上回调。

问题是,如果我正在进行异步单元测试,那么测试实际上会在主线程等待时阻塞它,因此永远无法发送回调。

我很确定这就是问题所在。有什么方法可以从另一个线程运行测试或者有一个XCTWaiter不阻塞主线程的方法吗?

编辑:在查看了一些文档之后,似乎最好的方法是在后台线程上运行整个测试用例。但是,在我当前的项目中,所有测试都是自动设置的。我想知道是否有人知道如何设置测试用例/手动运行。这样我就可以在另一个线程上运行它。

小智 5

这已经晚了一年多,所以可能不再相关了,但是我遇到了这个问题,因为我意识到 XCTestExpectation 解决了这个问题(不确定在您发布问题时是否可用)。

等待期望不会阻塞主线程,并允许异步分派到主线程的其他工作按预期进行。希望这可以帮助


Che*_* OT 5

考虑@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)
}
Run Code Online (Sandbox Code Playgroud)