【问题标题】:Xcode Async Unit Tests waiting on Main ThreadXcode 异步单元测试在主线程上等待
【发布时间】:2018-01-29 03:23:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能把等待方法分派给后台线程吗?
  • @Oletha 这样的作品,所有的测试都通过了。但是我的异步回调永远不会被调用,服务员超时永远不会失败。我认为因为当方法返回时一切都超出了范围。
  • 啊是的,有道理...

标签: ios unit-testing xctest


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    考虑@BetterLateThanNever 的回答。这是代码 sn-p 我如何在主线程中使用回调来测试我的代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      相关资源
      最近更新 更多