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