Infinity と NaN の文字列キャストをテストで網羅
ActiveModel::Type::Float が特殊文字列を対応する Float に変換することはドキュメントで明記されているが、テストが欠如していた。本 PR はそのカバレッジを追加し、回帰防止を強化した。
背景
テストが未整備だったことがリグレッションリスクを生んでいた。ActiveModel::Type::Float は内部で "Infinity"、"-Infinity"、"NaN" をそれぞれ Float::INFINITY、-Float::INFINITY、Float::NAN に変換するロジックを保持しているが、これらの経路を検証するテストが存在しなかった。ドキュメント上は変換規則が記述されているものの、実装が正しく動作することを自動的に保証できない状態だった。
この欠如は、将来的な実装修正やリファクタリング時に意図しない動作変化を検知できないことを意味した。実際のコードは activemodel/lib/active_model/type/float.rb の cast_value メソッド内で文字列比較を行い、該当する場合に固定の Float 定数を返す実装となっている。
テストを追加することで、これらの特殊ケースが将来の変更で破壊されないことを CI 上で保証できるようになる。これにより開発者は安心してロジックの拡張や最適化に取り組める。
技術的な変更
テストファイルに新しいケースが追加された。対象は activemodel/test/cases/type/float_test.rb で、test_type_cast_float_from_special_strings メソッドが導入された。
def test_type_cast_float_from_special_strings
type = Type::Float.new
assert_equal ::Float::INFINITY, type.cast("Infinity")
assert_equal(-::Float::INFINITY), type.cast("-Infinity")
assert_predicate type.cast("NaN"), :nan?
end
このテストは type.cast が文字列 "Infinity"、"-Infinity"、"NaN" をそれぞれ正しい Float 値に変換することを検証している。assert_equal で無限大と負の無限大を比較し、assert_predicate …, :nan? で NaN 判定を行うことで、実装が期待通りに動作することを明示的に確認できる。
変更はテストコードのみで、プロダクションロジックや公開 API には一切影響を与えない。そのため実行時のパフォーマンスや挙動に副作用はなく、CI のテストスイートに新たなカバレッジが加わるだけである。
設計判断
既存ロジックはそのままにテストだけを追加する方針が採られた。特殊文字列のキャスト機能は既に実装されているため、機能追加やバグ修正を伴う変更は不要と判断された。
この判断は後方互換性を最大限に保つことを意図したものである。新たな設定キーやメソッドを導入せず、現行の ActiveModel::Type::Float インターフェースをそのまま利用したテストを追加することで、既存コードへのリスクを最小化した。
結果として、Rails のテスト駆動品質保証方針に沿った形でカバレッジが拡充された。将来的にキャストロジックが変更された場合でも、追加されたテストが即座に回帰を検出できる設計となっている。
まとめ
今回の追加により、特殊文字列のキャストが確実に検証されるようになった。Infinity、-Infinity、NaN の 3 ケースがテストで網羅され、期待通りの Float 値が返ることが自動的に保証される。
テスト自体はシンプルで、assert_equal と assert_predicate を用いて実装結果と期待値を直接比較している。変更はコードベースに影響を与えず、CI 上での安全性が向上した。
結果として、将来の実装変更やリファクタリング時に回帰リスクが低減し、Rails の数値型処理に対する信頼性が高まった。