コンテンツにスキップ

rigor-minitest

MinitestTest::Unitのアサーション、およびその上に重ねられたMinitest/specの_(x).must_* / .wont_*マッチャーを通じてローカル変数をナローイング(narrowing)します。プラグインがサポートされるアサーションのシェイプ(shape)を認識すると、:local種別のナローイングファクト(fact)を発行するため、テスト本体の残りはアサートされた型に対して解決されます。さらに、テストフレームワークのsetupメソッドがインスタンス変数を初期化することをエンジンに伝え、これによりテスト本体で読まれるivarに対する誤ったnil警告が抑制されます。ソースのみを読み、minitestのランタイム依存はありません。

これはrigortypeにバンドルされて配布されます。plugins:の下で有効化してください。

plugins:
- rigor-minitest
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 cleanly
end
it "narrows the spec way" do
_(value).must_be_kind_of(String) # value narrowed to String
value.upcase
end

_(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_nilConstant<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_nilnilから除外する方向にナローイング
_(x).wont_equal(literal)Constant<literal>から除外する方向にナローイング

このプラグインは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_*へ移行してください。

アサーション認識器と、このプラグインが行使する契約サーフェス ── ADR-37のtype_specifierナローイングゲートとsetup向けのADR-38のadditional_initializers ── はプラグインのREADMEにあります。プラグインの書き方はexamples/rigor-plugin-authorスキルを参照してください。

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