【问题标题】:How to wait in a XCTest for T seconds without timeout error?如何在 XCTest 中等待 T 秒而不出现超时错误?
【发布时间】:2018-10-19 06:00:46
【问题描述】:

我想将测试进程延迟 T 秒,而不产生超时。

首先我尝试了显而易见的:

sleep(5)
XCTAssert(<test if state is correct after this delay>)

但是失败了。

然后我尝试了:

let promise = expectation(description: "Just wait 5 seconds")
waitForExpectations(timeout: 5) { (error) in
    promise.fulfill()

    XCTAssert(<test if state is correct after this delay>)
}

我的XCTAssert() 现在成功了。但是waitForExpectations() 超时失败。

这是根据XCTest wait functions的文档说的:

超时始终被视为测试失败。

我有什么选择?

【问题讨论】:

    标签: ios swift timeout wait xctest


    【解决方案1】:

    你可以使用XCTWaiter.wait函数;例如:

     let exp = expectation(description: "Test after 5 seconds")
     let result = XCTWaiter.wait(for: [exp], timeout: 5.0)
     if result == XCTWaiter.Result.timedOut {
         XCTAssert(<test if state is correct after this delay>)
     } else {
         XCTFail("Delay interrupted")
     }
    

    【讨论】:

      【解决方案2】:

      如果您知道某件事需要多长时间,并且只是想在继续测试之前等待该持续时间,您可以使用这一行:

      _ = XCTWaiter.wait(for: [expectation(description: "Wait for n seconds")], timeout: 2.0)
      

      【讨论】:

        【解决方案3】:

        最适合我的是:

        let timeInSeconds = 2.0 // time you need for other tasks to be finished
        let expectation = XCTestExpectation(description: "Your expectation")
        
        DispatchQueue.main.asyncAfter(deadline: .now() + timeInSeconds) {
            expectation.fulfill()
        }    
        
        wait(for: [expectation], timeout: timeInSeconds + 1.0) // make sure it's more than what you used in AsyncAfter call.
        
        // do your XCTAssertions here
        XCTAssertNotNil(value)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-16
          • 2016-10-12
          • 2015-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多