ActiveStorage::Variation にユニットテストを追加
ActiveStorage::Variation の public API を直接検証するユニットテストが新たに追加され、Blob や画像処理サービスを介さずにコアロジックの不変条件を文書化しました。これにより、Variation 層の信頼性がコードベースに明示的に残ります。
背景
ActiveStorage::Variation はバリューオブジェクトでありながら、専用のテストファイルが存在せず、変換ロジックは統合テスト経由でしか検証されていませんでした。既存の variant_test.rb やコントローラテストは Blob の生成や画像処理ライブラリに依存し、Variation の純粋な振る舞いを切り離すことが難しかったのが実情です。したがって、Variation のインターフェースを孤立させた単体テストが求められていました。
この課題に対し、PR は テスト専用 の変更として activestorage/test/models/variation_test.rb を追加し、外部リソースに依存しない形で 16 件のテストケースを提供します。テストは Variation の生成・キー生成・デフォルト設定・フォーマット検証を網羅し、既存の統合テストでカバーしきれなかった部分を補完します。結果として、Variation の不変条件が明文化され、将来的なリファクタリング時の安全網となります。
技術的な変更
新規追加された activestorage/test/models/variation_test.rb は、ActiveSupport::TestCase を継承したテストクラスで 16 のテストメソッドを定義しています。テストは主に以下の項目を対象とします:文字列キーの深層シンボル化、wrap の多様な入力ハンドリング、encode/decode/key のラウンドトリップ、シンボルと文字列キーによるキー・ダイジェストの同一性、default_to のデフォルト付与、format と content_type のバリデーションです。transform メソッドは MiniMagick/Vips に依存するため今回のスコープ外とし、既存の variant_test.rb に委ねています。
class ActiveStorage::VariationTest < ActiveSupport::TestCase
test "symbolizes string keys in transformations" do
variation = ActiveStorage::Variation.new("resize_to_limit" => [100, 100])
assert_equal({ resize_to_limit: [100, 100] }, variation.transformations)
end
test "wrap returns a Variation unchanged" do
variation = ActiveStorage::Variation.new(resize_to_limit: [100, 100])
assert_same variation, ActiveStorage::Variation.wrap(variation)
end
end
テストコードのみが追加されたため、アプリケーションの実行時挙動やパフォーマンスへの直接的影響はありません。テストスイートに組み込むことで、CI 上で Variation の契約違反が即座に検出され、開発者は意図しない変更を防止できます。
設計判断
この PR は Variation の public API をユニットレベルで保証する設計方針 を明示しています。生産コードを改変せず、テストだけでカバー範囲を拡大することで、既存の API 互換性を保ちつつ内部ロジックの正確性を文書化しています。
wrap や encode などの純粋 Ruby メソッドに対して細かな入力・出力検証を追加した点から、コアロジックは外部サービスに依存しない形でテスト可能であるべきという設計指針が読み取れます。テストが増えることで、将来的に Variation の実装を変更した際のリグレッションリスクが低減され、メンテナンスコストの削減につながります。
結果として、Rails コアコンポーネントのテスト駆動設計が一段階進み、Variation の振る舞いがコードベースに明示的に残る形となりました。
まとめ
本 PR は ActiveStorage::Variation に対し、外部依存なしで動作を検証する 16 件のユニットテストを導入し、変換ロジックの不変条件を公式に文書化しました。テストのみの追加でありながら、Variation の信頼性と将来の保守性を大幅に向上させています。