SuperAPI AI 工具集

swift-protocol-di-testing

测试与质量

查看项目

更新于 10-15 08:40

技能介绍

用途

该技能面向 Swift 开发,提供一套基于协议的依赖注入(Dependency Injection)模式,目的是让访问外部资源的 Swift 代码变得可测试。它通过把文件系统、网络、iCloud 等外部依赖抽象为小型、专注的协议,使测试可以在不进行真实 I/O 的前提下确定性地运行。

主要能力

  • 定义小而专注的协议:每个协议只负责一个外部关注点,例如文件系统访问、文件读写、书签存储等。
  • 提供默认(生产)实现:如 DefaultFileSystemProvider、DefaultFileAccessor,封装 FileManager 等真实调用。
  • 提供 Mock 实现:如 MockFileAccessor,可配置 files、readError、writeError 等属性,用于模拟正常与失败路径。
  • 通过默认参数注入依赖:生产代码默认使用真实实现,测试时注入 Mock。
  • 结合 Swift Testing 编写测试:使用 @Test、#expect(throws:) 等断言错误与结果。
  • 支持 Swift 并发:协议遵循 Sendable,可在 actor 边界间使用。

使用方式

  1. 为每个外部关注点定义协议,例如 FileSystemProviding、FileAccessorProviding、BookmarkStorageProviding,并让其遵循 Sendable。
  2. 编写默认实现,内部调用 FileManager 等系统 API。
  3. 编写 Mock 实现,暴露可配置的数据与错误属性。
  4. 在业务类型(如 SyncManager actor)的初始化方法中使用默认参数注入协议依赖。
  5. 在测试中构造 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 一致性。
  • 过度设计:没有外部依赖的类型不需要协议。

限制

资料未提供该技能的安装命令、平台支持范围、收费方式或价格信息,暂未提供。