用途:在 spec/services/ 下为服务类编写 RSpec 测试,适用于服务对象、API 客户端、编排器与业务逻辑。核心原则是测试公开契约(.call、.find、.search),而非内部实现;单元隔离用 instance_double,集成测试用 create。
工作流:写 → 运行 → 验证 → 修复。先写规格(正常路径、错误用例、边界用例),再运行 bundle exec rspec spec/services/your_service_spec.rb,确认失败原因正确(非拼写或缺失工厂),然后实现或修复直至通过,最后运行 bundle exec rspec spec/services/ 确认无回归。在步骤 1 写完并因正确原因失败前,不要先实现服务。
主要能力与约定:文件位置 spec/services/module_name/service_spec.rb;subject 用 subject(:service_call) { described_class.call(params) };单元隔离用 instance_double,集成用 create;多断言用 aggregate_failures;状态验证用 change 匹配器;时间相关用 travel_to;API 响应用 FactoryBot 哈希工厂(class: Hash)。
API 响应工厂:用 class: Hash 配合 initialize_with 构建哈希形状的响应夹具,例如 factory :api_animal_response, class: Hash 中定义属性并 initialize_with { attributes.stringify_keys },在规格中用 build(:api_animal_response, tag_number: 'TAG002')。
新测试文件清单:为主操作定义 subject;单元用 instance_double、集成用 create;每个公开方法覆盖正常路径;覆盖错误与边界(空输入、无效引用、失败);相关时覆盖部分成功场景;重复模式用 shared_examples;多断言用 aggregate_failures;状态验证用 change 匹配器;错误日志用 Logger 期望。
常见错误:只测正常路径会带来虚假信心,必须测失败;避免到处用 let!,除非无条件需要;工厂保持最小化;测试不应在实现重构而行为不变时失败,否则是在测内部而非契约。
可链技能:rspec-best-practices(通用风格与 TDD)、ruby-service-objects(被测服务约定)、ruby-api-client-integration(API 客户端层测试)、rails-engine-testing(引擎专属服务)。资源:assets/spec_examples.md、assets/testing_checklist.md。限制:资料未提供安装方式、版本要求、收费与平台信息。