帮助开发者用协议式依赖注入编写可测试的 Swift 代码并模拟外部依赖。
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "swift-protocol-di-testing" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/docs/ja-JP/skills/swift-protocol-di-testing/SKILL.md 2. 保存为 ~/.claude/skills/swift-protocol-di-testing/SKILL.md 3. 装好后重载技能,告诉我可以用了
请用 Swift 示例说明如何为网络请求模块做基于协议的依赖注入。要求定义精简协议、真实实现与 mock 实现,并展示如何在 Swift Testing 中测试成功与失败响应。
一套可运行的 Swift 结构示例,包含协议抽象、依赖注入方式以及对应单元测试代码。
我有一个 Swift 服务需要读取和保存本地文件。请帮我重构为面向协议的设计,抽离文件系统依赖,并提供 mock 版本用于测试读取失败、文件不存在和写入成功三种场景。
重构后的服务代码、文件系统协议、mock 实现,以及覆盖关键异常与成功路径的测试示例。
请演示如何把第三方 API 客户端封装成 Swift 协议,并在业务逻辑中通过依赖注入使用它。再给出 Swift Testing 测试,验证业务层在 API 超时、返回空数据和正常返回时的处理逻辑。
包含 API 抽象层、业务层注入方式和多场景测试用例的完整示例。
外部の依存関係(ファイルシステム、ネットワーク、iCloud)を小さく焦点を絞ったプロトコルとして抽象化することで、SwiftコードをテストしやすくするパターンI/Oなしの決定論的テストをサポートする。
各プロトコルは1つの外部関心事のみを処理する。
// File system access
public protocol FileSystemProviding: Sendable {
func containerURL(for purpose: Purpose) -> URL?
}
// File read/write operations
public protocol FileAccessorProviding: Sendable {
func read(from url: URL) throws -> Data
func write(_ data: Data, to url: URL) throws
func fileExists(at url: URL) -> Bool
}
// Bookmark storage (e.g., for sandboxed apps)
public protocol BookmarkStorageProviding: Sendable {
func saveBookmark(_ data: Data, for key: String) throws
func loadBookmark(for key: String) throws -> Data?
}
public struct DefaultFileSystemProvider: FileSystemProviding {
public init() {}
public func containerURL(for purpose: Purpose) -> URL? {
FileManager.default.url(forUbiquityContainerIdentifier: nil)
}
}
public struct DefaultFileAccessor: FileAccessorProviding {
public init() {}
public func read(from url: URL) throws -> Data {
try Data(contentsOf: url)
}
public func write(_ data: Data, to url: URL) throws {
try data.write(to: url, options: .atomic)
}
public func fileExists(at url: URL) -> Bool {
FileManager.default.fileExists(atPath: url.path)
}
}
public final class MockFileAccessor: FileAccessorProviding, @unchecked Sendable {
public var files: [URL: Data] = [:]
public var readError: Error?
public var writeError: Error?
public init() {}
public func read(from url: URL) throws -> Data {
if let error = readError { throw error }
guard let data = files[url] else {
throw CocoaError(.fileReadNoSuchFile)
}
return data
}
public func write(_ data: Data, to url: URL) throws {
if let error = writeError { throw error }
files[url] = data
}
public func fileExists(at url: URL) -> Bool {
files[url] != nil
}
}
本番コードはデフォルト値を使用し、テストはモックを注入する。
public actor SyncManager {
private let fileSystem: FileSystemProviding
private let fileAccessor: FileAccessorProviding
public init(
fileSystem: FileSystemProviding = DefaultFileSystemProvider(),
fileAccessor: FileAccessorProviding = DefaultFileAccessor()
) {
self.fileSystem = fileSystem
self.fileAccessor = fileAccessor
}
public func sync() async throws {
guard let containerURL = fileSystem.containerURL(for: .sync) else {
throw SyncError.containerNotAvailable
}
let data = try fileAccessor.read(
from: containerURL.appendingPathComponent("data.json")
)
// Process data...
}
}
import Testing
@Test("Sync manager handles missing container")
func testMissingContainer() async {
let mockFileSystem = MockFileSystemProvider(containerURL: nil)
let manager = SyncManager(fileSystem: mockFileSystem)
await #expect(throws: SyncError.containerNotAvailable) {
try await manager.sync()
}
}
@Test("Sync manager reads data correctly")
func testReadData() async throws {
let mockFileAccessor = MockFileAccessor()
mockFileAccessor.files[testURL] = testData
let manager = SyncManager(fileAccessor: mockFileAccessor)
let result = try await manager.loadData()
#expect(result == expectedData)
}
@Test("Sync manager handles read errors gracefully")
func testReadError() async {
let mockFileAccessor = MockFileAccessor()
…
为 TypeScript、JavaScript、React 与 Node.js 提供统一编码规范与最佳实践建议
帮助开发者掌握 Ktor 服务端常用模式、认证依赖注入与测试实践。
帮助开发者为代码代理配置性能优化、安全防护与研究优先工作流。
为 Windows 原生桌面应用生成并执行端到端自动化测试流程。
帮助 Swift 开发者实现基于 Actor 的线程安全内存与文件持久化方案
帮助团队编排多代理协作流程,管理任务归属、看板流转与交接控制。
帮助 Swift 开发者用协议依赖注入编写可测试代码并高效构建 Mock。
使用 MockDeviceKit 在无实体眼镜硬件时进行功能联调与测试验证
帮助开发者用 MockDeviceKit 无需实体眼镜即可进行应用测试与调试。
在编写或修改测试时识别反模式,避免错误 mock 与污染生产代码。
帮助开发者依据 Swift 并发迁移指南,规划并执行代码迁移与问题修复。
帮助开发者掌握 DAT SDK 的 Swift 规范、命名与异步开发模式