mcpField
W
write-tests

write-tests

github.com/igmarin测试与质量2843 次安装4 周前更新
代码仓库

关于 write-tests

用于编写、审查和整理 RSpec 测试的技能。它引导开发者采用测试先行流程,关注行为、编写确定性断言,并提供具体的 RED/GREEN 验证。

主要功能

  1. 01RSpec 测试先行流程
  2. 02测试类型选择指引
  3. 03以行为为中心的断言
  4. 04避免不稳定测试的指引
  5. 05RED/GREEN 输出要求

适用场景

  1. 01测试新的应用行为
  2. 02审查或整理 RSpec 测试
  3. 03编写服务对象测试
  4. 04排查不稳定测试模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/igmarin/rails-agent-skills --skill write-tests

安装后在 Claude Code 中输入/write-tests确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
complete_example.md
examples.md
output_checklist.md
spec_templates.md
tdd_proof_checklist.md

详细介绍

编写测试

当任务是编写、审查或清理 RSpec 测试时,使用本技能。

快速参考

方面规则
Spec 类型Model:领域逻辑 / 纯领域 → 从这里开始;Request:HTTP 端点;Job:后台处理;Service/PORO:纯 Ruby;System:E2E 跨层旅程(谨慎使用)
断言测试行为,而非实现
工厂最小属性;用 trait 表示选项;优先使用 build/build_stubbed 而非 create
Mock在类级别 stub 外部边界(例如 allow(Client).to receive);不要 mock Active Record
Service spec必需: describe '.call' 和 subject(:result)(见 assets/output_checklist.md)
let vs let!默认使用 let;仅当对象必须在动作之前存在时才使用 let!
示例名称使用现在时;不要用 should;不要用 and(见 assets/output_checklist.md)

硬性门槛

DO NOT write implementation code before a failing test exists.
Run bundle exec rspec and keep the real failure class and message.

核心流程

当用 RSpec 驱动新行为时,遵循以下顺序:

  1. 编写失败的 spec —— 选择能检验目标行为的最小 spec 类型(model > service > request > system),如上方 Spec 类型行所示。
  2. 运行它并确认失败消息 —— 展示具体的 RED 失败类/消息。不要将其留作占位符模板;不要在最终产物中使用示意性的 e.g. 失败示例。
  3. 实现最小代码使 spec 通过。
  4. 重构 —— 在保持测试套件通过的同时清理重复和命名。
  5. 验证 —— 提交前先运行相关的完整 spec 文件,再运行整个套件。

关于输出格式和 RED/GREEN 证明要求,请参阅 assets/tdd_proof_checklist.md。

Service Spec(锚定模式)
RSpec.describe Invoices::MarkOverdue do
  describe '.call' do
    subject(:result) { described_class.call(invoice: invoice) }

    context 'when the invoice is overdue and unpaid' do
      let(:invoice) { create(:invoice, due_date: 2.days.ago, paid_at: nil) }
      it 'marks the invoice overdue' do
        expect { result }.to change { invoice.reload.overdue? }.from(false).to(true)
      end
    end
  end
end
每个示例一种行为

每次都要拆分 it/specify 描述中的 and —— 没有例外。

# BAD — two assertions; if the first fails, the second never runs
it 'returns 201 and creates the record' do; end

# GOOD — one observable outcome per example
it 'returns 201' do; end
it 'creates the record' do; end

不稳定的测试与确定性断言

原因修复
依赖时间的逻辑freeze_time / travel_to;永远不要为走捷径而设置过去的日期
状态泄漏每个示例设置自己的状态;避免 before(:all)
异步 jobqueue_adapter = :test + have_enqueued_job;永远不要以命令式方式断言副作用
外部 HTTPWebMock / VCR;永远不要在 CI 中允许真实网络
数据库状态残留事务性 fixtures 或 DatabaseCleaner;永远不要跨 context 共享 let!
竞态条件显式使用 Capybara 等待;避免 sleep
不精确的断言用 change.from().to() 而非最终状态;用精确值而非 be_truthy/be_falsey;见规则 16

扩展资源(渐进式披露)

仅当需要其特定内容时才加载这些文件:

  • assets/complete_example.md —— 一个完整的、分步的 answer.md 高分示例,展示计划、spec、真实的 Observed RED/GREEN 输出以及验证表格。
  • assets/examples.md —— 用于 service spec、共享示例和工厂设计的代码示例。
  • assets/spec_templates.md —— 不同类型 spec 的标准模板。
  • assets/tdd_proof_checklist.md —— 当任务涉及新行为时使用;定义 RED/GREEN 证明格式、输出格式规则和 GREEN 进度条要求。
  • assets/output_checklist.md —— 完整的 18 点 RSpec 输出结构、约定和自我审查清单;还定义了所有输出风格规则(spec 结构、文件路径镜像、frozen_string_literal、subject(:result) 和 TDD 证明格式)。

输出风格

遵循 assets/tdd_proof_checklist.md 和 assets/output_checklist.md。展示真实的 RED/GREEN 命令输出。每个示例一种行为。

集成

技能何时串联
plan-tests首个切片的选择不明显
test-service该切片是一个服务 .call
tdd通过 PR 完成整个功能循环

评论

支持 Markdown