如何在测试时Assert错误被异步抛出?

xbp102n0  于 2022-10-23  发布在  Swift
关注(0)|答案(2)|浏览(162)

我们可以用XCTAssertThrowsError测试抛出的错误。可以使用expectation测试异步事物。我有一些方法可以将工作分派到后台线程,并在某个时候抛出错误。
有可能在将来的某个地方抛出错误吗?我想我需要把expectationXCTAssertThrowsError结合起来,但我不知道怎么做。
复制项目:https://github.com/Jasperav/ThrowingAsyncError。只需克隆项目并运行测试,其中一个测试就会失败。我制作了一个类,它将在分配后的几秒钟后崩溃。我想确保它在几秒钟后继续崩溃,所以我想要一个测试用例。

oewdyzsn

oewdyzsn1#

我看了一下复制项目,想知道你在这里想要实现什么。
据我所知:

XCTAssertThrowsError是接受可能引发的块的Assert。它们只是碰巧Assert,当同步块运行完毕时,会在其中抛出错误。
XCTestExspectation是跟踪请求条件是否满足的类。它们用于跟踪需要保留和检查的异步代码行为对象/引用。

您似乎要做的是让XCTestExspectationXCTAssertThrowsError以相同的方式工作,就像在异步块将抛出的同步Assert中一样。由于代码的运行和返回方式,它不会以这种方式工作。
您引用的异步代码不会引发(计时器初始值设定项)。据我所知,没有任何可以抛出的异步块。也许您应该问的问题是,我们如何才能使同步操作有时选择同步运行,但也在感觉像是...
或者,对于您想要测试的每个类中的一些额外复杂性,我已经制定了一个解决方案,几乎是最低限度的,以使其易于测试和可移植……
https://github.com/Jasperav/ThrowingAsyncError/pull/1/files
我能问一下你为什么要做这样的事吗?

kgsdhlau

kgsdhlau2#

您可以在预期失败的调用的Catch块中满足预期。

func testFailingAsyncCode() async throws {
    let expectation = expectation(description: "expect call to throw error")
    let dataFetcher = DataFetcher()

    do {
        // This call is expected to fail
        let data = try await dataFetcher.fetchData(withRequest: request, validStatusCodes: [200])
    } catch {
        // Expectation is fulfilled when call fails
        expectation.fulfill()
    }

    wait(for: [expectation], timeout: 3)
}

相关问题