BigInteger型の文字列シリアライズテストを追加
ActiveModel::Type::BigInteger のシリアライズは主に整数入力を対象としており、既存テストでも Integer と integer‑like クラスのみが検証されていました。実装は文字列入力もサポートしていますが、文字列に対する振る舞いを確認するテストが欠如していました。この欠如が、数値文字列や非数値文字列に対する期待動作の回帰リスクを残す要因となっていました。
背景
ActiveModel::Type::BigInteger のシリアライズは、整数型入力を安全に扱うことを目的として実装されています。既存テストは整数と整数風クラスに限定されており、文字列入力に関するカバー範囲が不足していました。文字列を to_i で整数に変換し、変換失敗時に nil を返すロジックはコード上に存在するものの、実際に期待どおり機能するかを検証するテストが存在しませんでした。
このギャップを埋めるため、文字列シリアライズの挙動を明示的に検証するテストが追加されました。
技術的な変更
テストファイル activemodel/test/cases/type/big_integer_test.rb に test_serialize_string メソッドが新規追加されました。
def test_serialize_string
type = Type::BigInteger.new
assert_equal 0, type.serialize("0")
assert_equal 123, type.serialize("123abc")
assert_nil type.serialize("not a number")
end
メソッドは文字列 "0" が 0 に、先頭が数値で続く "123abc" が数値部分だけ抽出され 123 に、数値要素を全く含まない "not a number" が nil にシリアライズされることをそれぞれ assert_equal / assert_nil で確認しています。テストは他の整数系テストと同一クラス内に配置され、既存テスト実行フローに自然に統合されます。
本 PR はプロダクションコードに変更を加えず、テストスイートの網羅性を向上させるのみです。
設計判断
ActiveModel::Type::BigInteger#serialize は文字列の場合、value.to_i で整数に変換し、変換結果が 0 かつ元文字列が数値でないときは nil を返すロジックを保持しています。これは non_numeric_string? メソッドを通じて判定され、整数入力と同様に安全に扱えるよう設計されています。
追加されたテストは、このロジックが期待通りに機能することを明示的に保証します。実装自体に変更は加えられないため、既存の設計方針や後方互換性への配慮はそのまま維持されています。
まとめ
本 PR は BigInteger 型の文字列シリアライズに関するテストケースを補完し、数値文字列の変換、先頭数値の切り捨て、非数値文字列の nil 返却といった3つの振る舞いを公式に保証します。テスト網の拡充により、将来的なコード変更やリファクタリングに対する回帰リスクが低減されます。