Capybara + Launchy で RSpec テストをブラウザで確認

スポンサーリンク

Capybara の save_and_open_page メソッドを使って、RSpec テスト中の任意の箇所で、スクリーンショットをブラウザで確認できる方法を知りました。動作に疑いのあるテストで、実際にブラウザで状態を確認できると助かりますね。今朝読んだ以下の記事で知った Capybara の Tips です。

Ruby – 使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」 – Qiita

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

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

Request Spec / Feature Spec などに save_and_open_page を追加

RSpec テスト中において、ブラウザで状態を確認したい箇所に save_and_open_page を追加します。

トップページのテストで、ページ遷移後正しい title を持っていることをテストするテストコードの例です。

テスト実行後、save_and_open_page 通過時にブラウザが起動する

テスト実行。

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で開くように設定しなおしてもう一度テスト実行。

今度は、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行目あたり

メタプログラミング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"]

スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
 
スポンサーリンク

Leave Your Message!