コンテンツにスキップ

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 # それを消費する
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-columnwarningカラムマッチャーがモデルに存在しないカラムを指している
plugin.shoulda-matchers.unknown-associationwarningアソシエーションマッチャーがモデルに存在しないアソシエーションを指している
plugin.shoulda-matchers.association-kind-mismatchwarningマッチャーが期待する種類(単数 / コレクション)がアソシエーションの実際の種類と食い違っている

カラムマッチャー: 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_forcallback(...))。
  • ルート / ルーティングマッチャーはありません ── それらはrigor-rspec-railsのドメインです。

describeウォーカー / マッチャーの認識器(recognizer)と、このプラグインが行使する契約(contract)のサーフェス(surface)(オプショナルな:model_indexの消費、NodeContextの祖先解決)については、プラグインのREADMEにあります。プラグインの書き方についてはexamples/rigor-plugin-authorスキルを参照してください。

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