Capybaraのsave_and_open_pageでcssを反映する方法

結論?

WEBrickを立ち上げっぱなしにして、そちらからJavaScriptとCSSをDLさせるという方法が一番しっくりきました。
RailsのテストでCSS適用のスクリーンショットを見る

注意!!

この方法を使うと、asset_hostがlocalhostじゃなくなるから、Ajaxが動かなくなるという現象にあたります。やっぱりこの方法はいけてないので、推奨しません。

以下、原文

我々はこのときをずっと待っていた。
Capybaraで保存したページのスクリーンショットはCSSが反映されてなくて、微妙だと思っていた。常々、思っていた。そこで、この問題を解決する方法はないものか?と思ってようやくググった。しかし、capybara save_and_open_page cssとかでググっても、セレクタの情報しか出てこない。当然だ。

ここで、googleさんのサジェストに救われた。
assetsという文字が出てきたのだ。srd!!と思った。

答えはここにあった。
save_and_open_page not working with capybara 2.0?

assets precompleをを実行しないといかんと。さらに、テスト用のassetsフォルダを準備することと、assets_hostを絶対パスに変更すること。なるほど。

まず、spec/spec_helper.rbを編集する。:suiteブロックに書くことで、テストのとき1度だけrake assets:precompileを実行する。

config.before :suite do
  %x[bundle exec rake assets:precompile]
end

次に、config/environments/test.rbを編集する。最後のほうに以下を追加する。

  config.assets.prefix = "assets_test"    # place test assets in public/assets_test directory
  config.action_controller.asset_host = "file://#{::Rails.root}/public"

これで、save_and_open_pageしたときに、cssが適用されたスクリーンショットが取れるようになる。
やったね!!と思ったのだが、このままだと毎回テストを流すたびにrake assets:precompileが実行される。この処理ってすごく遅いので、ストレスになる。

そこで、save_and_open_pageをするときだけ、assetsプリコンパイルするようにすればいいと思った。
もう一度、spec/spec_helper.rbを編集する。

config.before :suite do
  # コメントアウトしとくか、消す
  # %x[bundle exec rake assets:precompile] 
end
#...RSpec.configureブロックの外で、関数を定義する。
# save_and_open_pageは長いので、show_pageにする。
def show_page
  %x[bundle exec rake assets:precompile]
  save_and_open_page
end

これでスクリーンショットを取りたいときに、show_pageを書いたら、うまく動いてくれた。
いける。これでいける。


カテゴリー Ruby, Ruby on Rails | タグ | パーマリンク

コメント・トラックバック一覧

  1. Pingback: RailsのテストでCSS適用のスクリーンショットを見る | 自転車で通勤しましょ♪ブログ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です