XCTAssertThrowsError 用于 async/await 函数

XCTAssertThrowsError for async/await function

提问人:Richard Topchii 提问时间:11/1/2023 更新时间:11/1/2023 访问量:122

问:

给定以下方法签名,如何测试此方法:

func doTheJob(param: String) async throws -> String

跟?XCTAssertThrowsError

我试过了,但出现错误:XCTAssertThrowsError(await object.doTheJob(param: ""))

不支持并发的自动闭合中的“async”调用

这个问题的解决方案是什么?

Swift 单元测试 异步 async-await xctest

评论

0赞 Alirza Eram 11/6/2023
XCTAssertThrowsError 方法专为同步代码而设计,而不是异步代码。
0赞 Richard Topchii 11/6/2023
是的,我知道。问题是关于如果 or 类似的断言不适用于异步,如何以类似的方式测试异步方法。XCTAssertThrowsError

答:

1赞 lorem ipsum 11/1/2023 #1

使用反馈助手为此提交功能请求是个好主意,但现在您可以创建一个,如果没有funcXCTFailexpressionthrow

func xCTAssertThrowsError<T>(_ expression: @autoclosure () async throws -> T) async {
    do {
        _ = try await expression()
        XCTFail("No error was thrown.")
    } catch {
        //Pass
    }
}

然后你可以用它来做类似的事情。

func testExample() async throws {

    await xCTAssertThrowsError(try await doSomething())
}

如果要使用 和其他参数,也可以在自定义中实现这些参数。errorHandlerfunc

func xCTAssertThrowsError<T>(
    _ expression: @autoclosure () async throws -> T,
    _ message: @autoclosure () -> String = "",
    file: StaticString = #filePath,
    line: UInt = #line,
    _ errorHandler: (Error) -> Void = { _ in }
) async {
    do {
        _ = try await expression()
        XCTFail(message())
    } catch {
        errorHandler(error)
    }
}

评论

0赞 Richard Topchii 11/1/2023
有趣的设计,我会调查errorHandler
1赞 lorem ipsum 11/1/2023
@RichardTopchii第二个函数只是从文档中复制和粘贴,您也可以向其添加异步,例如在测试期间有错误处理程序的表达式。
1赞 lorem ipsum 11/1/2023
@RichardTopchii它将与 async/await 同步并在 catch 中被调用,如果您将 async 添加到处理程序,只需将 await 添加到它。
1赞 lorem ipsum 11/1/2023
@RichardTopchii不,只要你以正确的方式使用异步/await,就会有大量的“黑客”没有抓住重点。
1赞 lorem ipsum 11/1/2023
@RichardTopchii很乐意帮忙!