如何使用 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)")
}
}
我从这里重新创建了示例: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)")
}
}