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チェックする対象
Section titled “チェックする対象”FactoryBot.define do factory :user do name { "Alice" } email { "alice@example.com" } endend
FactoryBot.create(:user, name: "X") # ✓ info traceFactoryBot.build(:post, headline: "Hi") # ✗ unknown-attribute (suggest :title)FactoryBot.create(:usre) # ✗ unknown-factory (suggest :user)| ルール | 重大度 | 発火する条件 |
|---|---|---|
plugin.factorybot.factory-call | info | 呼び出しが既知のファクトリーに解決された。そのファクトリーが宣言する属性を一覧する |
plugin.factorybot.unknown-factory | error | リテラルの:nameがファクトリインデックスに存在しない(did-you-mean付き) |
plugin.factorybot.unknown-attribute | error | キーワードキーが宣言された属性でない(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呼び出しで偽陽性を出してしまうためです。
プラグインの内部構造
Section titled “プラグインの内部構造”ファクトリーのディスカバラー/インデックス、キャッシュされたプロデューサー、:model_indexの消費、デモ、そしてこのプラグインが用いる契約(contract)のサーフェス(surface)についてはプラグインのREADMEに記載されています。プラグインを書くにはexamples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.