Boolean型シリアライズと#serialize_cast_valueのテスト追加
ActiveModel::Type::Boolean に対し、serialize と serialize_cast_value の動作を検証するテストが追加されました。これにより、ブール型変換ロジック全体のテストカバレッジが向上し、将来的なリファクタリング時の安全性が高まります。
背景
それまでのテストスイートでは #cast のみが対象となり、シリアライズ系メソッドの振る舞いは検証されていませんでした。#serialize は内部で #cast を呼び出す実装であり、#serialize_cast_value は受け取った値をそのまま返すシンプルなロジックです。テストが欠如していると、実装変更が予期せぬ動作を引き起こすリスクがあります。
この PR はそのギャップを埋め、二つのメソッドが期待通りに動作することを明示的に確認します。
技術的な変更
テストファイル activemodel/test/cases/type/boolean_test.rb に test_serialize_boolean と test_serialize_cast_value_passes_the_value_through の二つのメソッドが追加されました。
def test_serialize_boolean
type = Type::Boolean.new
assert_nil type.serialize("")
assert_nil type.serialize(nil)
assert_equal true, type.serialize(true)
assert_equal true, type.serialize("yes")
assert_equal false, type.serialize(false)
assert_equal false, type.serialize("0")
end
test_serialize_boolean では空文字列および nil が nil に、真偽値や代表的な文字列 ("yes") が true に、false と "0" が false に変換されることを確認しています。
def test_serialize_cast_value_passes_the_value_through
type = Type::Boolean.new
assert_equal true, type.serialize_cast_value(true)
assert_equal false, type.serialize_cast_value(false)
assert_nil type.serialize_cast_value(nil)
end
test_serialize_cast_value_passes_the_value_through では、serialize_cast_value が入力値をそのまま返すこと、すなわち true、false、nil がそれぞれ変化しないことを検証しています。
これらのテスト追加により、#serialize と #serialize_cast_value が期待通りの振る舞いを持つことが CI 上で保証されます。
設計判断
ActiveModel::Type::Boolean の設計は、serialize が cast に委譲し、serialize_cast_value がパススルーというシンプルな構造になっています。
今回のテストはその設計意図をそのまま検証するものであり、実装の変更や API の拡張は行われていません。テストの充実により、将来的な内部リファクタリングが行われても外部から見た振る舞いが保持されることが期待できます。
設計は変わらず、テストが新たに検証ポイントを加えただけです。
まとめ
Boolean 型のシリアライズロジックと serialize_cast_value のテストが追加されたことで、型変換機能全体の信頼性が向上しました。プロダクションコードへの変更はなく、既存の動作に影響はありませんが、開発者が安心してこれらのメソッドを利用できる基盤が整いました。