该框架提供了额外的断言方法,例如:
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