' XCTest '用于自定义' XCTestCase '断言



AppleConcurrency框架缺乏对异步版本XCTAssertThrowsError的支持。我创建了一个公共函数来代替它。

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

我想用单元测试来覆盖这个函数。

最好的方法是什么?

看情况。

如果这是项目内部的:我从现有的测试用例中提取自定义的测试断言。然后我手动中断代码以确认断言按我希望的方式工作。我特别想看看我是否能使失败消息更具信息性。

我手动执行此操作,没有自动执行。

但是如果您打算将其发布到开放源代码,那么获得测试覆盖率是有意义的。这样做的目的是为那些没有与您一起工作的开发人员提供他们对您的测试框架所做更改的即时反馈。

我假设你知道如何测试handler(error)调用。(如果你不知道,让我知道,这样我可以补充这个答案。)问题是,我们如何测试对XCTFail的调用?下面是我们编写ApprovalTests.Swift的方法:

import XCTest
public protocol Failer {
func fail(_ message: String, file: StaticString, line: UInt) throws
}
public struct XCTFailer: Failer {
public func fail(_ message: String, file: StaticString, line: UInt) throws {
XCTFail(message, file: file, line: line)
}
}

来源:https://github.com/approvals/ApprovalTests.Swift/blob/master/ApprovalTests.Swift/Approvers/TestFailer.swift

我们没有直接调用XCTFail,而是引入了Failer协议。默认情况下,我们的代码使用XCTFailer()来实际调用XCTFail。要测试它,可以注入test Spy。

最新更新