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の最新版を使うと、SeleniumでJavaScriptのテスト簡単に書けます。
やり方
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に置きました。