rigor-rspec
各describe / contextスコープ内でのRSpecのlet / subject宣言を検証します。これは意図的に小さく作られています。同梱される2つのチェックは、提案されているRSpecサーフェス(surface)の中で偽陽性リスクが最も低く、純粋な構文ウォークモードで動作し、rspec / rubocop-rspecが必ずしも明確に表面化しない実際のバグを捕捉します。RSpecのランタイム依存はありません。
これはrigortypeにバンドルされて配布されます。plugins:の下で有効化してください。
plugins: - rigor-rspec何をチェックするか
Section titled “何をチェックするか”RSpec.describe "User" do let(:user) { :alice } let(:user) { :bob } # ← warning: duplicate `let(:user)`
let(:tags) { tags.map(&:up) } # ← error: self-referencing let
context "when admin" do let(:user) { :admin } # ← OK: different scope endendspec/user_spec.rb:5:3: warning: duplicate `let(:user)` in this scope (first declared at line 4); the last declaration wins at runtimespec/user_spec.rb:7:3: error: `let(:tags)` references its own name `tags` — this will infinite-loop at runtime- 同一スコープ内での
let/subject宣言の重複 ──warning。RSpecのランタイムは最後の宣言を優先するため、最初の宣言は黙ってシャドウされます。メッセージは最初の宣言の行を示します。 - 自己参照する
let/subject── 宣言した名前を自身のブロック本体の内側から呼び出すこと ──error。ランタイムでは無限ループになります。
ウォーカーはRSpec.describe … do(ルート)、ネストされたdescribe / context … do、let(:name) / let!(:name)、そしてsubject(:name) / 素のsubject(暗黙の:subject)を認識します。
設定ノブはありません。プラグインはプロジェクトのpaths:上のすべてのファイルをRSpec.describe … doブロックを探して走査します。認識されるdescribeブロックを持たないファイルは黙ってスキップされるため、spec以外のファイルと並べてプロジェクト全体で有効化しても安全です。
it本体内でのletタイポ検出はなし。itブロック内のスペルミスしたlet名をフラグするには、はるかに重いウォーカー(マッチャーDSL、ヘルパーメソッド、letスコープチェーン)が必要 ── 待機中です。- モックターゲット検証はなし。
xのメソッドに対するexpect(x).to receive(:nme)は別のスライス(slice)です。 - 共有コンテキストの解決はなし。
include_context、shared_context、it_behaves_likeは無視されます。 - 自己参照検出はブロック内のみ。間接的なループ(
let(:user) { foo }でfooがuserを呼び戻す場合)はフラグされません。 - 定数検証(
RSpec.describe SomeClass)はこのプラグインではなくエンジンの仕事です。
関連プラグイン
Section titled “関連プラグイン”rspec-railsとshoulda-matchersのマッチャーはほとんどが振る舞い的(静的な型ではなくランタイムの状態をアサートする)なので、ここでは対象外です。待機中のrigor-rspec-railsとrigor-shoulda-matchersプラグインが、それらに対するドメイン固有のdiagnosticを発行することになります。READMEがその境界を詳しく扱っています。
プラグイン内部
Section titled “プラグイン内部”スコープウォーカー / アナライザーのレイアウト、デモの実行方法、このプラグインが行使する契約(contract)サーフェス、今後の方向性のスライスはプラグインのREADMEにあります。プラグインの書き方はexamples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.