Enumerable ヘルパーのエッジケースに対するテストカバレッジ追加
ActiveSupport の Enumerable ヘルパー pluck、pick、compact_blank は、キーが欠如した要素や Set での挙動に関するエッジケースがテストされていませんでした。既存テストは全要素がキーを持つケースのみを対象としており、欠如時の戻り値がドキュメント通りであることを保証できませんでした。これらのギャップは将来的なリファクタリングやバグ修正で予期せぬ挙動変化を招く可能性があります。そこで本 PR は、これらのシナリオを明示的に検証するテストを追加しています。
背景
本変更は、pluck、pick、compact_blank の未テスト領域を埋め、ドキュメントに記載された振る舞いが実装と一致していることを保証することを目的としています。
技術的な変更
activesupport/test/core_ext/enumerable_test.rb に 5 つの新しいテストケースが導入されました。これにより、欠如したキーに対する pluck の挙動と、pick、compact_blank のエッジケースが網羅されます。
pluck の欠如キーテスト
test_pluck_with_a_key_missing_from_some_elements と test_pluck_with_multiple_keys_missing_from_some_elements の 2 つのテストが追加され、キーが存在しない場合に nil が返ることを検証します。
def test_pluck_with_a_key_missing_from_some_elements
assert_equal ["David", nil], [{ name: "David" }, { age: 9 }].pluck(:name)
end
def test_pluck_with_multiple_keys_missing_from_some_elements
assert_equal [[5, 99], [10, nil]], [{ dollars: 5, cents: 99 }, { dollars: 10 }].pluck(:dollars, :cents)
end
pick の欠如キーテスト
test_pick_with_keys_missing_from_the_first_element が追加され、最初の要素にキーが欠けている場合に nil が返ること、複数キー指定時にタプル内に nil が入ることを確認します。
def test_pick_with_keys_missing_from_the_first_element
assert_nil [{ age: 9 }].pick(:name)
assert_equal [5, nil], [{ dollars: 5 }].pick(:dollars, :cents)
end
compact_blank の Set 対応テスト
test_compact_blank_on_a_set_returns_an_array により、Set に対して compact_blank を呼び出した際に結果が Array になることと、nil や空文字が除去されることを検証します。
def test_compact_blank_on_a_set_returns_an_array
result = Set.new([nil, "", 1, false, 2]).compact_blank
assert_equal [1, 2], result
assert_instance_of Array, result
end
設計判断
テストの追加は、メソッドの仕様がドキュメント通りであることを明文化し、将来的なリグレッションを防止するための保守的な設計判断です。特に compact_blank が Set で Array を返すという挙動は、ドキュメント例と実装の整合性を保証する重要なポイントとなります。テストが増えることで、コードベースの信頼性が向上し、貢献者が安全に変更を加えられる環境が整います。
まとめ
本 PR は、pluck、pick、compact_blank のエッジケースに対するテストを追加し、未検証領域を埋めました。これにより、Rails の Enumerable ヘルパーがドキュメント通りに動作することが自動的に検証され、将来的な変更でも既存仕様が保護されます。