LoginSignup
15
15

More than 5 years have passed since last update.

Rails でプリコンパイルされてない Asset を参照していないかテストする

Posted at

(明記しない限り 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 使ってないときだけチェックするようにした。

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15