该框架提供了额外的断言方法,例如:
Error 类型的检查Error 类型的检查(当它遵循 Equatable 协议时)async 操作以及用于测试 Combine 的 Publisher 的辅助方法。
可能会发生这样的情况:async 操作不返回值或不抛出任何错误(例如,当从闭包或 Combine 转换时)。 在这种情况下,它们将无限期地挂起。XCTTimeout 可以捕获此问题并抛出错误,从而解除挂起的异步任务。
func test_whenGetDetails_thenReceivedExpectedDetails() {
(...)
// when
let details = try await XCTTimeout(
await sut.getDetails(),
timeout: 0.01
)
// then
XCTAssertEqual(details, expectedDetails)
}
使用 PublisherExpectation 来简化与 Publisher 流的工作,并避免样板代码。
例如,对于流值观察,使用 receivedValue(predicate:)。 要期望从流接收到特定值,请将 predicate 参数设置为
predicate: { $0 == expectedValue }
完整的代码示例如下
func test_givenValue_whenPublisherSend_thenReceivedExpectedValueInStream() {
// given
let value = "charizard"
let expectedValue = value
let sut = PassthroughSubject<String, Error>()
let expectation = PublisherExpectation(
sut,
observation: .receivedValue(
predicate: { $0 == expectedValue }
),
description : "Publisher did not receive expected value \(expectedValue)"
)
// when
sut.send(value)
// then
wait(for: [expectation], timeout: 0.01)
}
如果从流接收到的值无关紧要,请使用 .anyReceived() 便利方法。
对于流终止期望,使用 .completion(predicate:) 或 .anyCompletion()。
XCTAssertEqual 不会为不相等的值提供可读的输出。 使用 XCTAssertNoDiff 接收可读的差异。
XCTAssertNoDiff 依赖于 Difference,由 Krzysztof Zabłocki 创建。
文档由 DocC 生成。
| 项目 | 最低工具版本 |
|---|---|
| Swift | 5.8 |
| Xcode | 14.3 |
| 项目 | 最低目标版本 |
|---|---|
| iOS | 13.0 |
| macOS | 10.15 |
| watchOS | 6.0 |
| tvOS | 13.0 |
Swift Package Manager 是一种用于自动化分发 Swift 代码的工具,并且已集成到 swift 编译器中。
设置好 Swift 包后,将 XCTestExtension 作为依赖项添加到 Package.swift 中
dependencies: [
.package(url: "https://github.com/Filozoff/XCTestExtension.git", branch: "master")
]
并将其添加到你的 testTarget 的依赖项中
targets: [
(...)
.testTarget(
(...)
dependencies: [
(...)
"XCTestExtension"
]
)
]
https://github.com/Filozoff/XCTestExtension.git