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

时间:2017-06-21 16:06:27

标签: swift xcode xctest timeoutexception

我已经从这里重新创建了示例: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)
    }
}

在测试课程中

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

1 个答案:

答案 0 :(得分:1)

您的考试通过是因为您在completion之前致电sleep,所以您的期望几乎立即实现 - 之前等待5秒;虽然完成块是异步执行的,但很可能会在一秒钟内完成。

如果您在sleep内拨打completion,那么您的测试将按预期失败。但是,如果在调用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)")
    }
}