PureYAML/docs/rules-swift/exp/testing.md
Mihaela M 5f3892f2c1 chore(rules): vendor the rules-swift canon into docs/rules-swift
Mirror the shared Swift rules canon (rules-swift, commit 4ebb892) into
docs/rules-swift/ as a read-only reference alongside the repo's tailored
docs/rules/. PROVENANCE.md records the source, commit, and what was
included or excluded; the upstream repo's own VCS, CI, and lint tooling
is omitted as machinery rather than rule content.

Exclude the vendored tree from the style gate (scripts/check-style.sh)
and the pre-commit hook: the canon's enforcement docs quote the
forbidden attribution phrases to define them, the same reason the
repo's own enforcement files are already excluded.
2026-06-26 05:36:12 +02:00

1.2 KiB

Testing Patterns (Architecture Angle)

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

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

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

cd Packages
swift test --filter <PackageName>Tests

Folder layout: Packages/Sources/<Package>/ and Packages/Tests/<Package>Tests/.

Cross-package test doubles. Mocks live in the test target, not the source package. Public protocols can be defined in the source package; their mock implementations stay in Packages/Tests/<Package>Tests/Mocks/. Never publish mocks from Sources/ (they leak into production binaries).

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

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