(明記しない限り Rails 3.2.13、config/environments/* はデフォルトのままとする)
特に古い Rails アプリケーションをアップデートする場合に問題になるのだけど、
- config.assets.precompile への追加を忘れていた
- typo などで存在しない画像を image_tag で参照していた
などが原因で、プリコンパイルされていない Asset を参照している場合に、production 環境でページ表示時に例外が起きてしまう。
development 環境では問題が起きなかったり、少なくともページ表示時点では例外が起きないので気付きにくい。test でも同様。
ここでは、このようなケースでテストが失敗するようにしてみる。
テスト環境の設定
まず config/environments/test.rb
に下記の記述を追加する。
# Asset が precompile されていないときにエラー
config.assets.compile = false
config.assets.digest = true
これで production 環境と同様に digest つきの URL を生成し、プリコンパイルされていない asset を参照したときに自動でコンパイルしないようになる。
テスト時に Asset をプリコンパイルする
このままではテストの前に毎回 assets:precompile
を手動で実行しなければならないので、自動化する。
lib/tasks/rspec.rake
を作成し、下記のコードを記述する。
task "spec" => ["assets:clean", "assets:precompile"] do
Rake::Task["assets:clean"].execute
end
これで rake spec
の前にプリコンパイルし、終わったら削除するようになる。
test-unit などを使っている場合は、適宜書き換えてください。
既知の問題
遅い。assets 関係の task がとにかく遅い。
普段のテストとは分けて、リリース直前の回帰テストでだけチェックするとか考えた方がよい。
私の場合は unless defined?(Spork) && Spork.using_spork?
で囲って、Spork 使ってないときだけチェックするようにした。