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

7
我正在尝试使用Xcode中的单元测试来测试一些异步代码,但是我遇到了阻塞主线程的问题。问题在于被测试的一些代码期望从iOS类(AVFoundation)接收回调。然而,似乎AVFoundation类只会在主线程上回调。如果我正在进行异步单元测试,那么测试实际上会阻塞主线程,因此回调永远不会被发送。我相当确定这是问题所在。是否有任何方法可以从另一个线程运行测试或拥有不阻塞主线程的?编辑:在查看文档后,最好的方法似乎是在后台线程上运行整个测试用例。但是,在我的当前项目中,所有测试都是自动设置的。我想知道是否有人知道如何手动设置测试用例/运行方式。那样我就可以在另一个线程上运行它。

你能将等待方法分派到后台线程吗? - Oletha
@Oletha 这种方式有点奏效,因为所有的测试都通过了。但是我的异步回调从来没有被调用过,而且等待超时也从未失败过。我认为这是因为当方法返回时,所有的东西都超出了范围。 - Darnell Campbell
啊,是的,那很有道理... - Oletha
2个回答

7

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

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


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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接