testing

testing is a cursor rule for Cursor from muraaano/cursor-project-rules-on-rails. It costs 0 tokens per session (1,881 once invoked), scanned A, original, MIT.

A set of Japanese-language backend testing rules for RSpec, a Ruby testing framework, and Factory Bot, a tool for creating test data.

In plain words
What is it for?
Use it when writing or reviewing Rails tests, including subjects, grouped expectations, model attributes, factory files, naming, and folder layout.
Why use it?
It gives tests a consistent structure and makes related checks easier to read and maintain.

Cursor rule for Cursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add rules/muraaano/cursor-project-rules-on-rails/testing
Clone the repo
git clone --depth 1 https://github.com/muraaano/cursor-project-rules-on-rails

Made for: Cursor.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for testing

README.md
[![agentmods](https://agentmods.dev/badge/rules/muraaano/cursor-project-rules-on-rails/testing.svg)](https://agentmods.dev/rules/muraaano/cursor-project-rules-on-rails/testing)
Your own site
<a href="https://agentmods.dev/rules/muraaano/cursor-project-rules-on-rails/testing"><img src="https://agentmods.dev/badge/rules/muraaano/cursor-project-rules-on-rails/testing.svg" alt="Measured on agentmods" height="20"></a>
Per session 0 Nothing until a file matches its globs; then the whole rule loads.
When invoked 1,881 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00000 $0.01881
Opus 5 $0.00000 $0.00941
Sonnet 5 $0.00000 $0.00376
Haiku 4.5 $0.00000 $0.00188

Measured 4d ago against content hash 2db10f131ca1, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

testing scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.cursor/rules/testing.mdc · 213 lines

How it starts

The opening of the file, as written. The whole thing — 213 lines — stays where its author put it; the contents beside it link to each section on GitHub.

バックエンドテスト規約

RSpec

  • Factory Bot: テストデータ作成

テスト実装のルール

RSpec ルール

  • テスト対象となるメソッドやスコープは、subjectを使用して定義する

    • subjectは、テストの意図が明確になるようにし、describeの直後に定義する
  • ActiveRecord/ActiveModelのオブジェクトを検証する時は、なるべく have_attributes を使うことで、まとめて検証を行う。

  • FactoryBotを使用してテストデータを作成する

    # Bad
    expect(thing.name).to eq name
    expect(thing.hoge).to eq hoge
    expect(thing.email).to eq email
    
    # Good
    expect(thing).to have_attributes(
      name,
      hoge,
      email,
    )
    

同じケースに対するテスト

  • 同じケースに対する複数の検証は、可能な限り1つの it ブロックにまとめる
  • 複数の it ブロックに分けるのではなく、1つの it ブロックで複数の expect を使用する
  • it の行数が長くなる場合は、一定の塊にわけて記述し、塊の先頭に説明をコメントで記述する
# 良い例
it "ユーザーが正しく作成されること" do
  subject
  expect(user.name).to eq "山田太郎"
  expect(user.email).to eq "[email protected]"
  expect(user.active).to be true
end

# 良くない例
it "nameが正しく設定されること" do
  subject
  expect(user.name).to eq "山田太郎"
end

it "emailが正しく設定されること" do
  subject
  expect(user.email).to eq "[email protected]"
end

it "activeがtrueであること" do
  subject
  expect(user.active).to be true
end

テストデータの作成(FactoryBot)

全般
  • ./spec/factories にファイルを作成する
  • ファイル名はモデル名の複数形でスネークケースとする。ネームスペースがある場合は、ネームスペースでディレクトリを分ける 例1: Fruitモデルの場合は、spec/factories/fruits.rb 例2: Food::Fruitモデルの場合は、spec/factories/food/fruits.rb
  • factory はモデルごとにファイルを分けてください
  • factory名はモデル名のスネークケースとする。ネームスペースがある場合は、アンダースコアで繋げる 例: Food::Fruitモデルの場合は、food_fruitとする
Factoryの実装
  • それぞれの値はなるべくすべて設定する
    • nilをテストする場合はテストでfactoryを上書きする
  • それぞれの値はなるべくランダム値を設定する
# 良い例
FactoryBot.define do
  factory :fruit do
    name { ["りんご", "みかん", "レモン"].sample }
    active { [true, false].sample }
  end
end

# 良くない例
FactoryBot.define do
  factory :fruit do
    name { "りんご" }
    active { true }
  end
end
関連付けの実装
  • 関連付けは外部キーをもつモデルにのみデフォルトで記述する。
  • 外部キーをもたないモデルはtraitで記述する。
    • デフォルトでは with_associations というtraitを記述し、すべての関連するモデルを作成する
    • 個別にモデルを作成する必要がある場合は別途traitを作成し、 trait名は with_{association}とする
trait :with_users do
  users { build_list(:user, 2) }
end

Read the full file on GitHub · 213 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 4d ago First seen · 213 lines · 0 tokens per session scan A 2db10f131ca1

Subscribe to this mod's changes

testing is a cursor rule published in the GitHub repository muraaano/cursor-project-rules-on-rails (2 stars, last pushed 1y ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,881 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.