rigor-shoulda-matchers
RSpec.describe <Model> do … endブロック内のshoulda-matchers呼び出しを、モデルの実際のスキーマに照らして検証します。カラムマッチャー(validate_presence_of(:col)、have_db_column(:col)、…)は実在のカラムを指していなければならず(MUST)、アソシエーションマッチャー(belong_to(:assoc)、have_many(:assoc)、…)は一致する種類の実在のアソシエーションを指していなければなりません(MUST)。これはrigor-activerecordが公開する:model_indexファクト(fact)(ADR-9)に照らしてクロスチェックします ── そのためrigor-rspec(RSpec自身のlet / subject DSLを扱う)と重複するのではなく補完します。
これはrigortypeにバンドルされて配布されます。plugins:の下で、(消費するモデルインデックスを公開する)rigor-activerecordと一緒に有効化します。
plugins: - rigor-activerecord # :model_index を公開する - rigor-shoulda-matchers # それを消費するWhat it checks
Section titled “What it checks”RSpec.describe User do it { should validate_presence_of(:email) } # `email` がカラムならOK it { should validate_presence_of(:nme) } # 警告: 未知のカラム it { should belong_to(:author) } # `author` が単数ならOK it { should belong_to(:posts) } # 警告: 種類の不一致(posts はコレクション) it { should have_many(:comments) } # `comments` がコレクションならOK it { should have_many(:nonexistent) } # 警告: 未知のアソシエーションend| ルール | 重大度 | 発火条件 |
|---|---|---|
plugin.shoulda-matchers.unknown-column | warning | カラムマッチャーがモデルに存在しないカラムを指している |
plugin.shoulda-matchers.unknown-association | warning | アソシエーションマッチャーがモデルに存在しないアソシエーションを指している |
plugin.shoulda-matchers.association-kind-mismatch | warning | マッチャーが期待する種類(単数 / コレクション)がアソシエーションの実際の種類と食い違っている |
カラムマッチャー: validate_presence_of / _uniqueness_of / _length_of / _numericality_of / _acceptance_of / _inclusion_of / _exclusion_of / _absence_of / _format_of / _confirmation_of、およびhave_db_column / have_db_index。アソシエーションマッチャーとその期待する種類: belong_to / have_one(単数)、have_many / have_and_belong_to_many(コレクション)。どのモデルが検査されるかは、囲んでいるdescribe <Constant>(最も内側が優先)が固定します。
限定したルールで抑制します(例: # rigor:disable plugin.shoulda-matchers.unknown-column)。あるいは# rigor:disable plugin.shoulda-matchersでファミリー全体を黙らせます。
このプラグインに設定ノブはありません。rigor-activerecordがロードされていない場合 ── または解析対象のモデルのインデックスを公開していない場合 ── プラグインは沈黙します。クロスチェックはオプトインです。
- チェーンマッチャーの引数検証はありません ──
validate_length_of(:col).is_at_most(50)、validate_inclusion_of(:col).in_array([...])などのチェーン終端はランタイム専用です。 - ポリモーフィック /
through:の検証はありません ── 名前付きアソシエーションのみが検査され、チェーン修飾子は無視されます。 - ネスト属性マッチャーやコールバックマッチャーはありません(
accept_nested_attributes_for、callback(...))。 - ルート / ルーティングマッチャーはありません ── それらはrigor-rspec-railsのドメインです。
プラグインの内部
Section titled “プラグインの内部”describeウォーカー / マッチャーの認識器(recognizer)と、このプラグインが行使する契約(contract)のサーフェス(surface)(オプショナルな:model_indexの消費、NodeContextの祖先解決)については、プラグインのREADMEにあります。プラグインの書き方についてはexamples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.