assert_not_pattern エイリアスを宣言し、refute_pattern と統一
ActiveSupport のテスト支援機能は assert_not_* 系エイリアスで一貫性を保っているが、パターンマッチング系は例外だった。今回の PR で assert_not_pattern が refute_pattern のエイリアスとして追加されたことで、テストコードの可読性と統一感が向上する。
背景
ActiveSupport は assert_not_* エイリアスを提供し、assert_not_equal のように refute_* 系と対称的に使用できるよう設計されている。しかしパターンマッチング向けの assert_not_pattern が存在せず、利用者は直接 Minitest の refute_pattern を呼び出す必要があった。この不揃いがテスト記述の一貫性を阻害した。
Minitest 5.18.0 で assert_pattern と refute_pattern が導入されたことにより、パターンマッチングのアサーションが標準装備された。ActiveSupport 側はこの新機能に合わせて、同様の assert_not_pattern エイリアスを提供すべきという要請が浮上した。
技術的な変更
ActiveSupport::TestCase に assert_not_pattern エイリアスが追加された。エイリアスは refute_pattern を直接指すだけで、既存の実装や挙動を変更しない。
##
# :method: assert_not_pattern
#
# :call-seq:
# assert_not_pattern() { || ... }
#
# Alias for: refute_pattern
#
alias :assert_not_pattern :refute_pattern
テストスイートにも新しいメソッドの使用例が追加され、assert_not_pattern が正しく機能することを確認している。
def test_assert_not_pattern
assert_pattern { { a: true } => { a: true } }
assert_not_pattern { { a: true } => { a: false } }
end
変更点は CHANGELOG にも記載され、リリースノートとして利用者に周知される。
+* Declare `assert_not_pattern` as an alias for `refute_pattern`
+
+ *Sean Doyle*
設計判断
エイリアス方式を選択したことで、既存コードへの影響が最小化された。新たに独立したメソッドを実装すれば内部ロジックの重複やテストの追加負担が増えるが、エイリアスなら refute_pattern の実装をそのまま再利用できる。これにより後方互換性が保たれ、既存の assert_not_* 系との命名規則も統一された。
PR 内の議論では assert_not_pattern 用の独立設定キーを作る案も出たが、ActiveSupport の設計哲学である「シンプルなラッパー」を優先した結果、エイリアスという最小限の改変が採用された。
まとめ
assert_not_pattern のエイリアス追加により、ActiveSupport のテストヘルパーはパターンマッチング系でも assert_not_* 系の一貫性を提供できるようになった。既存実装への侵入を最小限に抑えつつ、テストコードの可読性と開発者体験が向上する。