首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCTestExpectation似乎不适用于Task()

XCTestExpectation似乎不适用于Task()
EN

Stack Overflow用户
提问于 2021-09-21 18:07:54
回答 1查看 503关注 0票数 2

我试图运行一个发出网络请求的测试actor,如果您在它还在请求时调用它,它将取消第一个请求并抛出一个CancellationError。我使用一个Task()来模拟它被异步两次调用,并且代码看起来运行得很好。我可以看到抛出的正确错误和正在执行的catch-block。下面是密码。

代码语言:javascript
复制
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)
}

在运行这个程序时,我会得到以下错误:

代码语言:javascript
复制
Asynchronous wait failed: Exceeded timeout of 1 seconds, with unfulfilled expectations: "Cancellation Error thrown".

但就像我说的。我可以看到catch-block正在执行,error是正确的类型,而expectation.fulfill()正在被调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 19:39:34

在阅读了@Alexander的评论后,我意识到我确实不需要等待任何东西。我将代码重新格式化如下,现在它开始工作了。

代码语言:javascript
复制
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)
    }
}

这如预期的那样起作用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69273645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档