ダミーアプリ生成時に `.railsrc` の設定を無視するオプションを追加
アクセプタンステスト用のダミーアプリ生成時に、ユーザーの ~/.railsrc が読み込まれることで発生するテストの誤動作を、--no-rc オプションの追加によって防ぐようにしました。
背景
rails new コマンドはデフォルトで ~/.railsrc を読み込み、記述されたオプションをアプリケーション生成に適用します。この挙動が、Springのアクセプタンステスト環境で問題を引き起こしていました。
例えば ~/.railsrc に --database=postgresql が記述されている場合、テスト用のダミーアプリが PostgreSQL を前提とした構成で生成されます。しかし、テスト環境では PostgreSQL が利用可能とは限らないため、アクセプタンステストがエラーまたは失敗していました。この問題は、開発者のローカル環境に依存する形で再現するため、CI環境では発生しないがローカルでは失敗する、という診断しづらい状況を生み出していました。
テスト用インフラは、実行環境の個人設定に左右されない再現性を持つべきです。.railsrc の内容はユーザーごとに異なるため、ダミーアプリの生成条件を一定に保つには明示的に無効化する必要がありました。
技術的な変更
test/support/application_generator.rb の generate_files メソッドで、rails new に渡すオプション配列に --no-rc が追加されました。
変更前:
skips = %w(--skip-bundle --skip-javascript --skip-sprockets --skip-spring --skip-listen --skip-system-test)
system("rails _#{version}_ new #{application.root} #{skips.join(' ')}")
変更後:
options = %w(--skip-bundle --skip-javascript --skip-sprockets --skip-spring --skip-listen --skip-system-test --no-rc)
system("rails _#{version}_ new #{application.root} #{options.join(' ')}")
変更点は2つです。まず、--no-rc がオプション配列に追加され、rails new 実行時に ~/.railsrc が読み込まれなくなりました。次に、変数名が skips から options に改名されています。既存のフラグは全て --skip-* 形式の除外指定でしたが、--no-rc はスキップとは異なるセマンティクスを持つため、配列全体をより汎用的な options と呼ぶことが適切と判断されました。
--no-rc は Rails のアプリケーションジェネレータが提供する公式オプションであり、~/.railsrc および .railsrc の読み込みを無効化します。この1フラグの追加により、ダミーアプリの生成条件がユーザー環境から切り離されます。
設計判断
既存のオプション配列に --no-rc を追加する最小限の修正 が採用されました。
ダミーアプリの生成コマンドは既に多くの --skip-* フラグを持ち、テスト環境に不要なコンポーネントを除外しています。--no-rc の追加はこの方針と一貫しており、「テスト対象以外の外部要因を排除する」という既存の設計方針を .railsrc にも適用したものです。変数名 skips から options への改名は機能上の変更を伴わないものの、配列の意味を正確に表現するリファクタリングとして妥当です。
まとめ
--no-rc の1行追加によって、Springのアクセプタンステストは開発者の ~/.railsrc の内容に関わらず一貫した環境で実行されるようになりました。テストインフラが個人設定から独立することで、環境依存による診断困難なテスト失敗を防ぎ、テストの信頼性が高まります。