我试图运行一个发出网络请求的测试actor,如果您在它还在请求时调用它,它将取消第一个请求并抛出一个CancellationError。我使用一个Task()来模拟它被异步两次调用,并且代码看起来运行得很好。我可以看到抛出的正确错误和正在执行的catch-block。下面是密码。
func testCancellation() async throws {
//setup code
let expectation = XCTestExpectation(description: "Cancellation Error thrown")
let autocompleteHandler = AutocompleteHandler(session: session)
Task() {
do {
let _ = try await autocompleteHandler.autocomplete(query: "Grizzly Bear")
} catch {
if error is CancellationError { expectation.fulfill() }
}
}
Task() {
do {
let _ = try await autocompleteHandler.autocomplete(query: "Grizzly Bear")
} catch {
if error is CancellationError { expectation.fulfill() }
}
}
wait(for: [expectation], timeout: 1)
}在运行这个程序时,我会得到以下错误:
Asynchronous wait failed: Exceeded timeout of 1 seconds, with unfulfilled expectations: "Cancellation Error thrown".但就像我说的。我可以看到catch-block正在执行,error是正确的类型,而expectation.fulfill()正在被调用。
发布于 2021-09-21 19:39:34
在阅读了@Alexander的评论后,我意识到我确实不需要等待任何东西。我将代码重新格式化如下,现在它开始工作了。
func testCancellation() async {
//Setup code
let autocompleteHandler = AutocompleteHandler(session: session)
async let first = autocompleteHandler.autocomplete(query: "Grizzly Bear")
async let second = autocompleteHandler.autocomplete(query: "Grizzly Bear")
do {
let _ = [try await first, try await second]
XCTFail("Should have thrown cancellation error")
} catch {
XCTAssert(error is CancellationError)
}
}这如预期的那样起作用。
https://stackoverflow.com/questions/69273645
复制相似问题