Sunday, December 19, 2010

my first impression of using capybara + akephalos

thoughtbot and the Holy Grail - GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS
を見て、 capybara + akephalos を試してみた。

結論から言うと、 jquery-ujs ajax リクエストのテストができたんですけど、補足事項がいくつかあります。

1. javascript_driver でなく default_driver を変更する必要があった
2. selenium でテストするときのように、サーバープロセスを起動してアクセスするので transactional_fixtures = false にしてテスト毎に DBの cleanup が必要

具体的には
# spec/spec_helper.rb
require 'akephalos'
#Capybara.javascript_driver = :akephalos
Capybara.default_driver = :akephalos


あと DB の cleanup は database_cleanupが便利でした。以下の例は transactional_fixtures を無効にして、全ての example が実行される前に一度 cleanup して、あとは example が終わると cleanup します。(truncate なので DatabaseCleaner.start はたぶん何もしないんですけど、 transaction strategy に変えたときには意味があるのでお約束です)

# spec/spec_helper.rb
RSpec.configure do |config|
config.use_transactional_fixtures = false
config.before(:suite) do
#DatabaseCleaner.strategy = :transaction
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end
end


元記事のコメントには「selenium より遅い」という意見があります。たしかに最初の akephalos サーバーの起動には時間かかるので、rspec コマンドで単体の example もしくは example group を実行しているときにはオーバーヘッドが大きいですね。しかし、 rake spec などで全部実行するときには akephalos サーバーの起動は一度で済むので、リクエスト自体は意外とサクサクと動いて僕の selenium のツライ経験からすると全然いいですね。

その他の注意事項としては、
1. 現状の akephalos (0.2.4) では capybara 0.4.0 に対応できてないので 0.3.9 を使うのですが、
within "#item_1"
はダメで、
within :css, "#item_1"
のように書く必要あり
2. webrat -> capybara 移行に際して、 capybara は rails の integration test のしくみを使ってないので、
get "/"
response.should contain("hoge")
が使えないので各、
visit "/"
,
page.should have_content("hoge")
などに書き換えが必要