RSpec+Capybara+SeleniumでJavaScriptのテスト

WEB+DB PRESS Vol.61の「Rails3テスト最前線」が話題のようです。
最新のRailscastsでちょうどRequest Specs and Capybaraが取り上げられていたので、WEB+DB PRESSの記事に載っていない部分を簡単にまとめてみます。

関連記事: WEB+DB PRESS vol.61 Rails3テスト最前線がすばらしい - tech-kazuhisa's blog

結論から言うと

Capybaraの最新版を使うと、SeleniumJavaScriptのテスト簡単に書けます。

やり方

Gemfileで、capybaraの最新版を使うようにgitリポジトリを指定します。JavaScriptとDBを同時に使う機能のテストをする場合はdatabase_cleanerも必要です。

group :development, :test do
  gem 'rspec'
  gem 'rspec-rails'
  gem 'capybara',  :git => 'git://github.com/jnicklas/capybara.git'
  gem 'database_cleaner'
end

spec/spec_helper.rbでcapybara/rspecを読み込みます。

require 'capybara/rspec'

database_cleanerを使う場合はspec/spec_helper.rbに設定を追加します。Seleniumを使ったテストを行う場合、デフォルトの "use_transactional_fixtures = true" ではDBを使ったテストは失敗します。

    config.use_transactional_fixtures = false # for selenium

    config.before(:suite) do
      DatabaseCleaner.strategy = :truncation
    end
    
    config.before(:each) do
      DatabaseCleaner.start
    end
    
    config.after(:each) do
      DatabaseCleaner.clean
    end

JavaScriptを使うテストに ":js => true" を付ければ完了です。テストはFirefoxで実行されます。*1

  describe "POST /articles", :js => true do
  # ...
  end

  # または

  it "JSのテスト", :js => true do
  # ...
  end

:js => true なテストはブラウザが立ち上がるのでとても遅いです。JavaScriptを使わないテストだけを実行したい場合は、

rspec -t '~js' spec

とすれば良いでしょう。(sporkを使うと -t '~tag' は無視されるような気がするけどなんでだろう)

おまけ

WEB+DB PRESSの記事には載っていないようですが、capybaraを使ったインテグレーションテストのひな形を生成するには以下のコマンドが使えます。(r は railsエイリアス、articleはテストするモデル名)

r g integration_test article

これを実行すると、spec/requests に下のようなファイルが生成されます。

require 'spec_helper'

describe "Articles" do
  describe "GET /articles" do
    it "works! (now write some real specs)" do
      # Run the generator again with the --webrat flag if you want to use webrat methods/matchers
      get articles_path
      response.status.should be(200)
    end
  end
end

サンプルコード

githubに置きました。

*1:Firefoxさえ入っていれば特に設定はいらないようです。仕組みは...謎です