Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)

Posted

技术标签:

【中文标题】Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)【英文标题】:iOS Asynchronous Unit Testing (waitForExpectations failing) in Xcode 8 / Swift 3 【发布时间】:2016-09-25 20:42:02 【问题描述】:

我正在更新我为使用 Swift 3 而开发的 Cocoapod。在升级之前,我所有的异步单元测试都运行良好。但是现在升级后,它们中的每一个都立即失效,我不知道为什么。以下是每一个的结构:

override func setUp() 
        super.setUp()
        validationExpectation = expectation(description: "Validation")


.
.
.

func testSymbolRequest()

        _ = MyCocoapod.makeSymbolRequest(symbol: "ABC", success:  (symbolObject) in
            self.validationExpectation.fulfill()
            XCTAssert(true)
        )  (error) in
            self.validationExpectation.fulfill()
            XCTFail(error.description)
        

        waitForRequestToFinish()


.
.
.

func waitForRequestToFinish()
    waitForExpectations(timeout: 60.0)  (error) in
        if let error = error 
            XCTFail(error.localizedDescription)
        
    

waitForExpectations 函数根本不等待。调用后立即失败。我还确认这与我的实际网络代码无关,并且请求在我的 Cocoapod 示例项目中运行良好。我正在使用 Alamofire。我认为这不是问题,但我认为这可能值得一提。打印出来的错误信息是“未知错误”。

【问题讨论】:

【参考方案1】:

如果您尝试测试您正在开发的 CocoaPod,出于某种原因,它创建的默认测试目标会使 waitForExpectations() 函数无法针对该特定测试目标正常工作。通过按顺序执行以下步骤,我能够让它最终工作:

    删除当前测试目标 创建新的测试目标 运行 pod install 并确保 pod 文件已相应更新

按照这些步骤,我能够让 waitForExpectations() 最终在我的网络请求中工作。

【讨论】:

以上是关于Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)的主要内容,如果未能解决你的问题,请参考以下文章

iOS:UIView 的 Autolayout 拉伸高度过多(Xcode 8、Swift 3)

使用 swift 3 Xcode 8.2.1 在 iOS 上运行预构建的可执行文件

iOS 10 / Swift 3.0 / XCode 8 总结

如何在 Xcode 8/Swift 3 中创建 iOS liveView [重复]

Socket.IO 错误:zlib 没有这样的模块(Swift 3,Xcode 8.3)

导航不出现 Xcode 8.1 iOS 10 Swift 3