XCTestExtension: XCTest assertions and helpers XCTestExtension: XCTest assertions and helpers

XCTestExtension

CI Codecov Swift Supported Versions Platforms Swift Package Manager GitHub

该框架提供了额外的断言方法,例如:

以及用于测试 CombinePublisher 的辅助方法。

用法示例

使用结构化并发

可能会发生这样的情况:async 操作不返回值或不抛出任何错误(例如,当从闭包或 Combine 转换时)。 在这种情况下,它们将无限期地挂起。XCTTimeout 可以捕获此问题并抛出错误,从而解除挂起的异步任务。

func test_whenGetDetails_thenReceivedExpectedDetails() {

    (...)

    // when
    let details = try await XCTTimeout(
        await sut.getDetails(),
        timeout: 0.01
    )

    // then
    XCTAssertEqual(details, expectedDetails)
}

使用 CombinePublisher 和期望

使用 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 Package Manager 是一种用于自动化分发 Swift 代码的工具,并且已集成到 swift 编译器中。

设置好 Swift 包后,将 XCTestExtension 作为依赖项添加到 Package.swift

dependencies: [
    .package(url: "https://github.com/Filozoff/XCTestExtension.git", branch: "master")
]

并将其添加到你的 testTarget 的依赖项中

targets: [
    (...)
    .testTarget(
        (...)
        dependencies: [
            (...)
            "XCTestExtension"
        ]
    )
]

Xcode 项目 (Swift Package Manager)

  1. 转到 File->Add Packages...
  2. "Search or Enter Package URL" 中粘贴 https://github.com/Filozoff/XCTestExtension.git
  3. 选择适合你需求的 Dependency RuleProject,然后转到 Add Package
  4. Add to Target 下选择你的测试目标,然后转到 Add Package