如何使用 waitForExpectations() 触发超时失败测试?

How to trigger failed test on timeout with waitForExpectations()?

我从这里重新创建了示例:http://www.mokacoding.com/blog/testing-callbacks-in-swift-with-xctest/

我想使用 waitForExpectations() 测试超时。这应该模仿超时的长 运行 过程。为此,我在被调用函数中设置了一个 sleep() 命令,该命令比 waitForExpectations() 中的超时长。

但是,sleep() 没有任何效果。测试总是通过。我也试过将 sleep() 放在 completion(true) 之前,但这不会改变结果(即通过测试)。

知道我在做什么吗运行超时触发测试失败?

class SomeService {
    func doSomethingAsync(completion: (_ success: Bool) -> ()) {
        completion(true)
        sleep(5)
    }
}

测试中class

let service = SomeService()
service.doSomethingAsync { (success) in
    XCTAssertTrue(success, "assert is true")
    expect.fulfill()
}

waitForExpectations(timeout: 3) { (error) in
    if let error = error {
        XCTFail("timeout errored: \(error)")
    }
}

您的测试通过了,因为您在 sleep 之前调用了 completion,所以您的期望几乎立即得到满足 - 您等待 5 秒;虽然完成块是异步执行的,但很可能会在一秒钟内完成。

如果您在 completion 中调用 sleep 那么您的测试将如预期的那样失败。但是,如果调用 expect.fulfill() 时测试不再是 运行,则您的测试可能会崩溃,因为 expect 在执行时可能已不存在,因为它可能已被清理为测试失败后立即(大约 2 秒后预期将实现)。

class SomeService {
    func doSomethingAsync(completion: (_ success: Bool) -> ()) {
        DispatchQueue.main.async {
            completion(true)
        }
    }
}

测试:

let service = SomeService()
service.doSomethingAsync { (success) in
    XCTAssertTrue(success, "assert is true")
    sleep(5)
    expect.fulfill()
}

waitForExpectations(timeout: 3) { (error) in
    if let error = error {
        XCTFail("timeout errored: \(error)")
    }
}