コンテンツにスキップ

rigor-factorybot

すべてのFactoryBot.create(:name, key: …) / .build(…) / .build_stubbed(…) / .attributes_for(…) / *_list呼び出しを、ファクトリー定義のインデックスに照らして検証します。未知のファクトリー名や、そのファクトリーが宣言していない属性キーはフラグが立てられます(それぞれdid-you-mean付き)。rigor-activerecordも有効な場合、属性キーはさらにモデルのカラムと相互チェックされます。FactoryBotの実行時依存はありません。

rigortypeにバンドルされて配布されます。plugins:の下で有効化します。

plugins:
- rigor-factorybot
# - rigor-activerecord # optional: enables the AR column cross-check
spec/factories/users.rb
FactoryBot.define do
factory :user do
name { "Alice" }
email { "alice@example.com" }
end
end
FactoryBot.create(:user, name: "X") # ✓ info trace
FactoryBot.build(:post, headline: "Hi") # ✗ unknown-attribute (suggest :title)
FactoryBot.create(:usre) # ✗ unknown-factory (suggest :user)
ルール重大度発火する条件
plugin.factorybot.factory-callinfo呼び出しが既知のファクトリーに解決された。そのファクトリーが宣言する属性を一覧する
plugin.factorybot.unknown-factoryerrorリテラルの:nameがファクトリインデックスに存在しない(did-you-mean付き)
plugin.factorybot.unknown-attributeerrorキーワードキーが宣言された属性でない(did-you-mean付き)。:model_indexが利用可能な場合はモデルのカラムとも照合される

レガシーのFactoryGirl定数も同じ方法で認識されます。認識されるエントリメソッドはcreate / build / build_stubbed / attributes_for*_list系です。ファクトリー内ではname { … }(モダン)、name "…"(レガシーの位置引数)、add_attribute(:name) { … }を認識します。

plugins:
- gem: rigor-factorybot
config:
factory_search_paths: ["spec/factories", "spec/factories.rb"] # default
# Minitest projects: ["test/factories"]
  • リテラル引数のみ — 変数名を渡すFactoryBot.create(name)は素通りします。
  • トレイト/シーケンス/関連はまだ収集されないtrait :admin do … endの内側でのみ定義された属性は、トレイトのスライス(slice)が出荷されるまで、誤ったunknown-attributeを表面化させることがあります。
  • 明示的なレシーバーのみ — 素のcreate(:user)include FactoryBot::Syntax::Methodsによるもの)は、このスライスでは認識されません。これにはレシーバーの型推論が必要で、それがなければ無関係なすべてのcreate呼び出しで偽陽性を出してしまうためです。

ファクトリーのディスカバラー/インデックス、キャッシュされたプロデューサー、:model_indexの消費、デモ、そしてこのプラグインが用いる契約(contract)のサーフェス(surface)についてはプラグインのREADMEに記載されています。プラグインを書くにはexamples/rigor-plugin-authorスキルを参照してください。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.