rigor-minitest
MinitestとTest::Unitのアサーション、およびその上に重ねられたMinitest/specの_(x).must_* / .wont_*マッチャーを通じてローカル変数をナローイング(narrowing)します。プラグインがサポートされるアサーションのシェイプ(shape)を認識すると、:local種別のナローイングファクト(fact)を発行するため、テスト本体の残りはアサートされた型に対して解決されます。さらに、テストフレームワークのsetupメソッドがインスタンス変数を初期化することをエンジンに伝え、これによりテスト本体で読まれるivarに対する誤ったnil警告が抑制されます。ソースのみを読み、minitestのランタイム依存はありません。
これはrigortypeにバンドルされて配布されます。plugins:の下で有効化してください。
plugins: - rigor-minitest何を推論するか
Section titled “何を推論するか”def test_user user = build_user assert_kind_of(User, user) # user narrowed to User user.name.upcase # `.name` resolves on User
found = find_user(1) refute_nil(found) # found narrowed away from nil found.id # `.id` resolves cleanlyend
it "narrows the spec way" do _(value).must_be_kind_of(String) # value narrowed to String value.upcaseend_(x)、value(x)、expect(x)はすべてspecラッパーとして受け入れられます。Test::Unitのassert_not_kind_of / assert_not_nil / assert_not_equal / assert_not_instance_ofは、それぞれのrefute_*相当物と認識器(recognizer)を共有します。
| アサーション / マッチャー | xへの効果 |
|---|---|
assert_kind_of(T, x) / assert_instance_of(T, x) | Tにナローイング |
assert_nil(x) | Constant<nil>にナローイング |
assert_equal(literal, x) | Constant<literal>にナローイング |
assert_match(regex, x) | Stringにナローイング |
refute_kind_of / refute_instance_of(+assert_not_*) | Tから除外する方向にナローイング |
refute_nil(x) / assert_not_nil(x) | nilから除外する方向にナローイング |
refute_equal(literal, x) / assert_not_equal(...) | Constant<literal>から除外する方向にナローイング |
_(x).must_be_kind_of(T) / must_be_a(T) / must_be_instance_of(T) / must_be_an_instance_of(T) | Tにナローイング |
_(x).must_be_nil | Constant<nil>にナローイング |
_(x).must_equal(literal) | Constant<literal>にナローイング |
_(x).must_match(regex) | Stringにナローイング |
_(x).wont_be_kind_of(T) / wont_be_instance_of(T) | Tから除外する方向にナローイング |
_(x).wont_be_nil | nilから除外する方向にナローイング |
_(x).wont_equal(literal) | Constant<literal>から除外する方向にナローイング |
diagnosticなし、設定なし
Section titled “diagnosticなし、設定なし”このプラグインはdiagnosticを発行せず、設定ノブも持ちません ── エンジンにナローイングファクトを提供するだけです。解析されるすべてのファイルを走査します。認識されるシェイプにマッチしないとき、テスト以外のファイルは手を付けられずに素通りします。
- ブロックシェイプのマッチャーはなし ──
assert_raises(T) { ... }、assert_throws(:tag) { ... }。ナローイングは直線的なローカル変数を対象とします。 - 述語 / respond-toマッチャーはなし ──
assert_predicate(x, :foo?)、assert_respond_to(x, :m)はRigorがモデル化していないキャリア(carrier)を必要とします。 assert_in_delta/assert_operatorはなし ── 浮動小数点範囲 / 汎用演算子のナローイングは今後の作業です。- レガシーな素の
x.must_be_kind_of(T)はなし(Minitest < 6.0) ── レシーバーそのものが値なので、ナローイングする対象がありません。_(x).must_*へ移行してください。
プラグイン内部
Section titled “プラグイン内部”アサーション認識器と、このプラグインが行使する契約サーフェス ── ADR-37のtype_specifierナローイングゲートとsetup向けのADR-38のadditional_initializers ── はプラグインのREADMEにあります。プラグインの書き方はexamples/とrigor-plugin-authorスキルを参照してください。
© 2026 TypedDuck. Licensed under CC BY-SA 4.0.