Railsアプリをインテグレションテストするために、Capybaraをtest-unitといっしょに使う

「Capybara test unit」とか検索すると、なんか正解が出てこない気がするので、メモ。test-unit-capybaraとかあるけど、なにをやってくれるのか良くわからん。

結局のところ、必要なのは次の3つ。

  1. Gemfileに書く
  2. capybara/railsをrequireする
  3. IntegrationTestの中でCapybaraをincludeする

そもそもCapybaraってなに? Cucumberと関係あるの?

私がCapybaraについて聞いたのはCucumberに関する文脈だったせいで、ちょっと混乱していたのですが、この二つは特に関係ありません。

Capybaraというのは

インテグレーションテストしやすくするためのフレームワーク

で、

  • visit "/"
  • click "button"

みたいなAPIを提供してくれて、ブラウザの動作をテストでシミュレーションしやすくするためのものです。

Cucumberというのは

受け入れテストを自然言語に近い形で記述するためのフレームワーク

で、

  • Given I have entered 50 into the calcurator
  • かつ "ウォッチする"ボタンをクリックする

とか書くためのなんかです。これはこれで面白い試みだと思いますし、ちょっとやってみたら結構楽しいのですが、まあ私には必要ない。で、Cucumerbのなかで「クリックする」とかいうやつをうまいこと処理するために使用しているのが、webratとかcapybaraとかです。

Gemfileを更新する

gem 'capybara'

と書きましょう。

capybara/railsをrequireする

test_helper.rbあたりで、

require 'capybara/rails'

しておきます。

IntegrationTestでCapybaraをincludeする

Railsでインテグレイションテストすると、ActionDispatch::IntegrationTestとかいうクラスを使うみたいなので、この中で、

include Capybara

します。

2番と合わせて、test_helperに

require 'capybara/rails'
class ActionDispatch::IntegrationTest
  include Capybara
end

とか書いておくのが良いと思います。

テストを書く

test "visit root and got redirected" do
  visit "/"
  assert_equal "/ja", current_path
end

とか、普通にCapybara::DSLに定義されてるやつを使います。

まとめ

さあ、テスト書くぞー