- 更新日: 2015年1月2日
- RSpec
Capybara + Launchy で RSpec テストをブラウザで確認
Capybara の save_and_open_page メソッドを使って、RSpec テスト中の任意の箇所で、スクリーンショットをブラウザで確認できる方法を知りました。動作に疑いのあるテストで、実際にブラウザで状態を確認できると助かりますね。今朝読んだ以下の記事で知った Capybara の Tips です。
Ruby – 使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」 – Qiita
Capybara の save_and_open_page メソッドについては以下。
Method: Capybara::Session#save_and_open_page — Documentation for jnicklas/capybara (master)
— 環境 —
capybara (2.2.0)
launchy (2.4.3)
rspec-rails (2.14.0)
gem ‘launchy’ を Gemfile に追加してインストール
Capybara の save_and_open_page メソッドは、Launchy に依存しているので、前もって Launchy をインストールします。
Gemfile
1 2 3 4 |
group :test do gem 'launchy' # ... end |
1 2 3 4 5 |
$ bundle install ... Installing launchy 2.4.3 |
Request Spec / Feature Spec などに save_and_open_page を追加
RSpec テスト中において、ブラウザで状態を確認したい箇所に save_and_open_page を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
describe "Home pages" do let(:user) { FactoryGirl.create(:user) } before do @home = t("home.index.title") @logo = "logo" end subject { page } # ... it "should have the right links on the layout" do visit root_path click_link @logo save_and_open_page # ここに追加 expect(page).to have_title( @home ) # ... end #... end |
トップページのテストで、ページ遷移後正しい title を持っていることをテストするテストコードの例です。
テスト実行後、save_and_open_page 通過時にブラウザが起動する
テスト実行。
1 2 3 |
$ bundle exec rspec spec/requests/home_pages_spec.rb |
save_and_open_page メソッドは、Rails ディレクトリの tmp/capybara/ 以下に一時ファイル(スクリーンショット)を作成して、それをアプリケーション(ブラウザ)で開く仕組みになっているようです。
しかし最初は save_and_open_page を通過した所で、なぜか MacVim で tmp/capybara 以下の .html(一時ファイル)が立ち上がってしまいました。
原因を掴むため Capybara の save_and_open_page メソッドで Launchy の open を呼び出している部分からソースを読み始め、Launchy のソースも読んでみましたところ、どうやらホストOSでデフォルト設定されたアプリケーションが一番最初に優先利用されて、.html拡張子のファイルを開くっぽい…。
.htmlファイルをデフォルトで MacVim で開くようにしていたので、Finder から .htmlファイルをFirefoxで開くように設定しなおしてもう一度テスト実行。
1 2 3 |
$ bundle exec rspec spec/requests/home_pages_spec.rb |
今度は、save_and_open_page メソッドのところで、無事に Firefox が立ち上がって確認できました。save_and_open_page メソッドはそのままでは、CSSを適用せずにブラウザ表示します。CSS適用するには以下を参考。
Capybaraのsave_and_open_pageでcssを反映する方法 | 自転車で通勤しましょ♪ブログ
Capybara, Launchy のソースコード読み
Capybara の save_and_open_page で Launchy の open クラスメソッドに委譲している部分、ここからソースを読んでいくと動作がつかめました。$ bundle open gem_name で簡単に gem ライブラリを開けます。
lib/capybara/session.rb 367行目あたり
1 2 3 4 5 6 7 8 9 10 11 |
def save_and_open_page(file_name=nil) file_name = save_page(file_name) begin require "launchy" Launchy.open(file_name) rescue LoadError warn "Page saved to #{file_name} with save_and_open_page." warn "Please install the launchy gem to open page automatically." end end |
メタプログラミングRubyを読んだおかげで、gem のソースを読むのがとても楽になりました。Ruby の gem は、多くの場合 Ruby のメタプログラミングが活用されていて、Launchy の gem ソースコードでも以下のようなテクニックが使われていました。
1. inherited オーバーライドによる、クラスがサブクラスに継承された時のフック定義。
inherited (Class) – Rubyリファレンス
2. extend SomeModule によるモジュールのメソッドのクラスメソッド化。Module に対する extend と include の使い分け。
3. class << self の記法によるクラスメソッド定義。 などなど他にも沢山。メタプログラミングRubyを読んで知ったRubyのテクニックがたくさん登場してきて、ソースコードを読むのが楽しかったです。 上記のようなテクニックについて知らない、または知識が曖昧という場合は、メタプログラミングRubyはぜひおすすめです。Rubyのちょっと突っ込んだ難しい点について、頭にかかった霧がすっきり晴れます。コードを書くスキル以外にも、gem ソースコードを読む力が間違いなく向上すると思います。ということで、メタプログラミングRubyの宣伝でこのエントリーを締めくくりますね(笑。 [amazonjs asin="4048687158" locale="JP" title="メタプログラミングRuby"]
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
- Serverspec で複数のホストで共通のテストを使い回す
Leave Your Message!