SQLite3テストコードでのprivateメソッド呼び出しを修正
Rails 8.0のSQLite3アダプターテストで、privateメソッド lookup_cast_type を使用していた箇所を修正し、Column の初期化方法を簡素化しました。これはRails 8.0と8.1の間でのColumn APIの変更に起因する問題の解決です。
背景
Rails 8.1で #56817 により Column の初期化処理が変更されました。この変更により、cast_type パラメータが Column の initialize メソッドに追加されましたが、Rails 8.0にはこの変更が含まれていません。しかし、8.0のテストコードでは8.1を前提とした書き方が残っており、privateメソッドである lookup_cast_type を呼び出していました。
Rails 8.0ブランチではこのメソッド呼び出しが不要であるため、互換性と適切なカプセル化のために修正が必要でした。
技術的な変更
activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb の2つのテストメソッドから、lookup_cast_type の呼び出しと cast_type 変数を削除しました。
変更前:
def test_rowid_changes_column_equality
cast_type = @conn.lookup_cast_type("integer")
type_metadata = SqlTypeMetadata.new(sql_type: "integer", type: :integer)
rowid_column = SQLite3::Column.new("id", cast_type, nil, type_metadata, true, nil, rowid: true)
regular_column = SQLite3::Column.new("id", cast_type, nil, type_metadata, true, nil, rowid: false)
assert_not_equal rowid_column, regular_column
end
変更後:
def test_rowid_changes_column_equality
type_metadata = SqlTypeMetadata.new(sql_type: "integer", type: :integer)
rowid_column = SQLite3::Column.new("id", nil, type_metadata, true, nil, rowid: true)
regular_column = SQLite3::Column.new("id", nil, type_metadata, true, nil, rowid: false)
assert_not_equal rowid_column, regular_column
end
同様の修正が test_generated_type_changes_column_equality にも適用され、Column.new の第2引数に cast_type の代わりに nil を渡すようになりました。Rails 8.0の Column クラスでは、この引数位置は default であり、cast_type は存在しないため、nil を渡すことが正しい使い方です。
設計判断
privateメソッドへの依存を排除する方針 が採用されました。
テストコードであってもprivateメソッドを直接呼び出すことは、内部実装への不適切な依存を生み出します。Rails 8.0では Column の初期化に cast_type が不要であることから、これらのテストは単に nil を渡すだけで意図した動作を検証できます。参照コミット a34dd91 で導入された生成カラムの等価性テストを、8.0ブランチの実装に合わせた形に調整した判断です。
まとめ
本PRは、Rails 8.0ブランチのテストコードを、そのバージョンの実装に合わせて修正した変更です。privateメソッドへの依存を取り除き、Column の初期化を簡素化することで、テストコードの保守性と適切なカプセル化を実現しています。