sinatraでテストの入門の入門(その3)sinatraでcapybara

以前書いたものの続きです。
rspecと同様ほとんど変りはありません。と言ったら違うか。。

サンプルコード

require './hello_world'
require 'capybara'
require 'capybara/dsl'
require 'test/unit'

class HelloWorldTest < Test::Unit::TestCase
  include Capybara::DSL
  # Capybara.default_driver = :selenium

  def setup
    Capybara.app = Sinatra::Application.new
  end

  def test_it_works
    visit '/'
    assert page.has_content?('Hello World')
  end
end

コードの理解

capybaraを使う場合は

  • capybara
  • capybara/dsl

をrequireする必要があります。
元のページではインクルードするのはCapybaraモジュールでしたが、テストを動かすと「CapybaraでなくCapybara::DSLをインクルードしなさい」と警告が出るので直しています。
後はcapybaraっぽく書けば出来そうですね。

ドライバーを変えるには

capybaraの得意技の一つであるブラウザドライバの変更ですが、サンプルコードでコメントになっている部分

Capybara.default_driver = :selenium

のように指定すればよいです。

がしかし!

Failures:

  1) The HelloWorld App works
     Failure/Error: visit '/'
     Selenium::WebDriver::Error::WebDriverError:
       unable to obtain stable firefox connection in 60 seconds (127.0.0.1:7055)
     # ./hello_by_capybara_spec.rb:20:in `block (2 levels) in <top (required)>'

Finished in 73.62 seconds
1 example, 1 failure

Failed examples:

rspec ./hello_by_capybara_spec.rb:19 # The HelloWorld App works

となってブラウザが動かなくなってる。。。どうしたものかー。下書きした時はうまく動いたのになー

と悩んでいるうちにcapyabaraのissueで議論されていました。
https://github.com/jnicklas/capybara/pull/460です。

ようするにcapybara1.0.0で依存指定するselenium-webdriverのバージョンが古かったようです。
selenium-webdriverって最新だと2.5なんだけど、capybaraでは0.2を指定していたという。。
他の要件でselenium-webdriver入れてたら、こんなこと起らんもんなぁ。。

capybara1.0.1にするとselenium-webdriverが新しいバージョンが入るので解決出来ます。

rspecでは?

こんな感じでした。

require './hello_world'
require 'capybara'
require 'capybara/dsl'
require 'rspec'

describe 'The HelloWorld App' do
  include Capybara::DSL
  # Capybara.default_driver = :selenium

  before do
    Capybara.app = Sinatra::Application.new
  end

  it 'works' do
    visit '/'
    page.should be_has_content('Hello World')
  end
end

まとめ

1. sinatraのテストでcapybaraを使うことも簡単(test/unit、rspecともに)
2. includeするのはCapybaraでなく、Capybara::DSL
3. ドライバーの変更も出来る。
(テスト毎にドライバーを変更するやり方は未調査)
4. ライブラリは最新版を使いましょう。