おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

minitest と capybara で rails3 の integration テストを書く

ハマったのでメモ。素の minitest と capybara でテストを書く方法もありますが、とりあえず試してみるなら minitest-railsminitest-rails-capybara を使うのが一番早いです。

Gemfile に下記のように書いて bundle install

group :development, :test do
  gem "minitest-rails"
end

group :test do
  gem "minitest-rails-capybara"
end

下記コマンドで test/minitest_helper.rb を生成します。

rails generate mini_test:install

さらに、test/minitest_helper.rbrequire "minitest/rails/capybara" の行をコメントアウトします。その後下記のようなコマンドで integration test の雛形を生成します。

rails generate integration_test CanAccessTop --spec

--spec は rspec 風の雛形を生成するためのオプションです。生成されるファイルはなぜか test/integration ディレクトリではなく、test/acceptance ディレクトリ配下に作られます。個人的には少し気に入らない挙動です(最終的に僕は素の minitest と capybara でいくことにしました)。

生成されたファイルから、capybara のDSLを使って簡単なテストを書いてみます。トップページ自体はできてる前提です。

require "minitest_helper"

describe "トップページにアクセスしたとき Acceptance Test" do
  before { visit '/' }
  it 'トップページと表示されていること' do
    page.text.must_include 'トップページ'
  end
end

ここで注意するのは、describe メソッドに渡す文字列の末尾を ‘Acceptance Test’ にすることです(‘Integration Test’ でも可。incase sensitive)。minitest-rails は describe に渡される文字列を正規表現パースして integration test か否かを判別しているようです。’Acceptance Test’が末尾に存在しないと、Capybara::DSL が include されずエラーになります。

最終的に、下記のコマンドでテストを実行してみます。

ruby -Itest test/acceptance/can_access_top_test.rb
Run options: --seed 50774

# Running tests:

.

Finished tests in 0.356557s, 2.8046 tests/s, 5.6092 assertions/s.

1 tests, 2 assertions, 0 failures, 0 errors, 0 skips

無事テストが通りました。やったね。