`bigdecimal` 4.x のデフォルト文字列表現変更に対応したArelテストの修正
bigdecimal gem のバージョン 4.x へのアップグレードにより、BigDecimal#to_s の出力形式が変わり、Arel の SQL 生成テストが失敗するようになりました。テストの期待値を固定文字列から BigDecimal#to_s の動的な出力に変更することで、この問題を解消しています。
背景
bigdecimal のバージョンアップに伴い、従来 "2.14" と評価されていた値が "0.214e1" として評価されるようになり、Arel::Visitors::ToSQLTest 内の test_0032_should visit_BigDecimal が失敗するようになりました。
PR の説明に記載されたテスト失敗メッセージがその状況を明確に示しています:
Arel::Visitors::ToSQLTest::the to_sql visitor#test_0032_should visit_BigDecimal
Expected: "2.14"
Actual: "0.214e1"
テストコードが期待値として "2.14" という固定文字列を持っていたため、bigdecimal がどの表記を返すかに依存した壊れやすい(brittle)テストになっていたといえます。
技術的な変更
テストの期待値を固定文字列から BigDecimal#to_s の動的な出力へ切り替えることで、bigdecimal のバージョン間の差異を吸収しています。
変更前:
_(compile(Nodes.build_quoted(BigDecimal("2.14")))).must_equal "2.14"
変更後:
_(compile(Nodes.build_quoted(BigDecimal("2.14")))).must_equal BigDecimal("2.14").to_s
あわせて Gemfile.lock の bigdecimal が 3.2.3 から 4.1.2 へ更新されています。テストコードの変更は1行のみですが、「Arelの BigDecimal ビジターが BigDecimal#to_s と一致する文字列を生成すること」という本来の意図を正確に表現した形になっています。
設計判断
期待値を動的化することで、bigdecimal の出力形式をテストの関心事から切り離す方針が採られました。
Arel の visit_BigDecimal の責務は BigDecimal オブジェクトを SQL に適した文字列へ変換することです。その文字列がどの表記形式(固定小数点か指数表記か)であるかは、bigdecimal 側の実装に委ねられます。BigDecimal("2.14").to_s を期待値として使うことで、「Arel が BigDecimal#to_s の出力をそのまま使用している」という実装事実をテストに反映させており、実装とテストの整合性が明確になっています。
"2.14" を "%.2f" のような書式で固定する方向ではなく to_s に追随する方針を採ったことは、出力形式の責任を bigdecimal 側に委ねるという判断を示しています。
まとめ
本PRは bigdecimal 4.x への対応として、テストの期待値を gem の実際の出力に同期させる最小限の修正です。固定文字列への依存をなくすことで、将来の bigdecimal の出力形式の変化にも追随できるテストになっています。