用途
该技能面向 Swift 开发,提供一套基于协议的依赖注入(Dependency Injection)模式,目的是让访问外部资源的 Swift 代码变得可测试。它通过把文件系统、网络、iCloud 等外部依赖抽象为小型、专注的协议,使测试可以在不进行真实 I/O 的前提下确定性地运行。
主要能力
- 定义小而专注的协议:每个协议只负责一个外部关注点,例如文件系统访问、文件读写、书签存储等。
- 提供默认(生产)实现:如 DefaultFileSystemProvider、DefaultFileAccessor,封装 FileManager 等真实调用。
- 提供 Mock 实现:如 MockFileAccessor,可配置 files、readError、writeError 等属性,用于模拟正常与失败路径。
- 通过默认参数注入依赖:生产代码默认使用真实实现,测试时注入 Mock。
- 结合 Swift Testing 编写测试:使用 @Test、#expect(throws:) 等断言错误与结果。
- 支持 Swift 并发:协议遵循 Sendable,可在 actor 边界间使用。
使用方式
- 为每个外部关注点定义协议,例如 FileSystemProviding、FileAccessorProviding、BookmarkStorageProviding,并让其遵循 Sendable。
- 编写默认实现,内部调用 FileManager 等系统 API。
- 编写 Mock 实现,暴露可配置的数据与错误属性。
- 在业务类型(如 SyncManager actor)的初始化方法中使用默认参数注入协议依赖。
- 在测试中构造 Mock 并注入,使用 Swift Testing 的 @Test 与 #expect 验证行为与抛出的错误。
适用场景
- 任何触及文件系统、网络或外部 API 的 Swift 代码。
- 需要测试在真实环境中难以触发的错误处理路径。
- 需要同时运行于 App、测试和 SwiftUI 预览等不同环境的模块。
- 使用 Swift 并发(actor、结构化并发)且需要可测试架构的应用。
最佳实践
- 单一职责:每个协议只处理一个关注点,避免“上帝协议”。
- Sendable 一致性:协议跨 actor 边界使用时必须遵循 Sendable。
- 默认参数:生产代码默认使用真实实现,仅测试指定 Mock。
- 错误模拟:Mock 应提供可配置的错误属性以测试失败路径。
- 只 Mock 边界:只对外部依赖(文件系统、网络、API)做 Mock,不 Mock 内部类型。
应避免的反模式
- 用单个大协议覆盖所有外部访问。
- Mock 没有外部依赖的内部类型。
- 用 #if DEBUG 条件编译代替正规依赖注入。
- 与 actor 配合时忘记 Sendable 一致性。
- 过度设计:没有外部依赖的类型不需要协议。
限制
资料未提供该技能的安装命令、平台支持范围、收费方式或价格信息,暂未提供。