处理非结构化并发时,如何用Swift Testing编写谓词预期测试?
在Swift Testing中验证值的异步变化
在非结构化并发场景下验证某个值最终发生变化,Swift Testing提供了更简洁的异步断言方式,无需依赖NSPredicate或XCTNSPredicateExpectation。
替代XCTest实现的Swift Testing代码
import Testing @Test func testServiceValueUpdates() async { let service = SomeService() let expectedValue = "your-target-value" // 触发会异步修改值的操作 service.doSomething(expectedValue) // 等待条件满足,超时时间设为1秒 try await wait(for: 1.0) { #expect(service.something == expectedValue) } }
关键说明
- 测试函数必须标记为
async,以支持异步测试逻辑 wait(for:_:)函数会定期执行闭包内的断言,直到断言通过或达到超时时间- 如果需要更复杂的检查逻辑,也可以在闭包里编写自定义判断,配合
#expect抛出断言失败
原XCTest实现对比
你之前在XCTest中的实现:
let predicate = NSPredicate { service, _ in guard let service = service as? SomeService else { return false } return service.something == expectedValue } let expectation = XCTNSPredicateExpectation(predicate: predicate, object: service) sut.doSomething(expectedValue) wait(for: [expectation], timeout: 1.0)
Swift Testing的写法去掉了繁琐的谓词和期望对象创建,直接将断言逻辑嵌入等待闭包,代码更直观简洁。
内容的提问来源于stack exchange,提问作者lazarevzubov
相关产品推荐
相关产品推荐

