PureXML/third_party/rules-swift/exp/testing.md

1.9 KiB

Testing Patterns (Architecture Angle)

ExtremePackaging-specific testing concerns: per-source-target test targets and cross-target test doubles. Full Swift Testing rules live in testing.md (the top-level rule). Both files state the source-target/test-target pairing rule by deliberate cross-context dual-homing.

Full Swift Testing rules live in testing.md. Two ExtremePackaging-specific points:

Per-source-target test target. Every source target ships with a matching test target. Run a single target's tests in isolation:

cd <active-package-root>
swift test --filter <PackageName>Tests

Folder layout: Sources/<Package>/ and Tests/<Package>Tests/ in package repos; Packages/Sources/<Package>/ and Packages/Tests/<Package>Tests/ in project monorepos.

Cross-target test doubles. Mocks live in the test target, not the source target. Public protocols can be defined in the source target; their mock implementations stay in Tests/<Target>Tests/Mocks/ or Packages/Tests/<Target>Tests/Mocks/, matching repository shape. Never publish mocks from Sources/ (they leak into production binaries), except in a declared test-support target that the gate checks (testing.md, section "Exception: test-support targets").

// Sources/ApiClient/APIClientProtocol.swift
public protocol APIClientProtocol {
    func login(email: String, password: String) async throws -> User
}

// Tests/ApiClientTests/Mocks/MockAPIClient.swift
public struct MockAPIClient: APIClientProtocol { /* ... */ }

Acceptance check

Compare every source target in Package.swift with the test targets: each source target MUST have exactly one <SourceTarget>Tests partner that depends on it. Grep production Sources/ for test-double names and confirm mocks live only under the matching test target. Run each new target's filtered tests once, then run the full suite and cite the total count.