考虑这个基于 XCTest 的单元测试:
func testImageRetrieved() {
let expectation = XCTestExpectation()
let cancellable = viewModel.$image.dropFirst().sink { _ in
// Do nothing on completion.
} receiveValue: {
XCTAssertNotNil($0)
expectation.fulfill()
}
wait(for: [expectation], timeout: 1.0)
cancellable.cancel()
}
根据 Apple 的从 XCTest 迁移测试,这应该可以直接转换成这种基于 Swift 测试的方法:
@Test
func imageRetrieved() async {
var cancellable: AnyCancellable?
await confirmation { imageRetrieved in
cancellable = viewModel.$image.dropFirst().sink { _ in
// Do nothing on completion.
} receiveValue: {
#expect($0 != nil)
imageRetrieved()
}
}
cancellable?.cancel()
}
但是,后一个测试失败,错误提示:“确认已确认 0 次,但预计确认 1 次。” 看起来确认不会“等到”发布者发出值。
在 Swift Testing 中测试 Combine 发布者的正确方法是什么?