Rails 3.0 で cucumber のテストを通す

備忘録。Mac OSX 10.5 環境で Rails 3.0 を使って cucumber でテストを書きます。

インストール

主に下のリンクを参照しました。

http://d.hatena.ne.jp/yuunachan/20101004/1286161317

なお、私の環境(Mac OSX 10.5)では Nokogiri が libxml2 のバージョンが古すぎる!と警告を出してきますが、とりあえず動作に問題はなさそうなので今回は無視する事にします。さらに、元記事に従って capybara も採用する方向で話を進めます。


まずは RAILS_ROOT/Gemfile を編集します。データベースは postgres を使うので、そこもあわせて編集。ここは各自の環境にあわせて下さい。

# gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'pg'
# 中略
group :cucumber do
  gem 'rspec-rails', '>=2.0.0.beta.10'
  gem 'capybara'
  gem 'database_cleaner'
  gem 'cucumber-rails'
  gem 'cucumber'
  gem 'spork'
  gem 'launchy'
  gem 'ramaze'
  gem 'webrat'
end

編集が終わったらインストールコマンドを叩きます。

bundle install vendor/bundle

無事にインストールが済めば gem の準備は完了。cucumber のジェネレータが作動するよう、初期化を行います。

rails g cucumber:install ja --rspec --capybara

準備段階はここまでで完了。

テストする

続いて、実際にテストを書いて動作を確認してみます。こちらは下の記事のサンプルを見ながら試しました。

http://gihyo.jp/dev/serial/01/ruby/0022

まずは scaffold でひな形一式を作成して、テーブルを作成(database.yml の編集をお忘れなく)。

rails g scaffold user email:string name:string age:integer
rake db:migrate
rake db:test:prepare

無事に通ったら cucumber のフィーチャを作成します。

rails g cucumber:feature users

コマンドが通ると RAILS_ROOT/features/manage_users.feature というファイルができているので、中身をすべて消して書き換えます。

#language:ja
フィーチャ: ユーザを管理したい
  シナリオ: ユーザの登録
    前提 "ユーザ登録"ページを表示している
    もし "user_email"に"example@example.com"と入力する
    かつ "user_name"に"ProjectHL2"と入力する
    かつ "user_age"に"17"と入力する
    かつ "Create"ボタンをクリックする
    ならば "User was successfully created."と表示されていること
    かつ "example@example.com"と表示されていること
    かつ "ProjectHL2"と表示されていること
    かつ "17"と表示されていること

技評のサイトに載っている情報はやや古いらしく、そのままではテストを通過しなかったため、一部書き換えています。

次に、上で登録した"ユーザ登録"ページとはどこなのかを cucumber に教えてあげるために RAILS_ROOT/features/support/paths.rb を編集します。

module NavigationHelpers
  # Maps a name to a path. Used by the
  #
  #   When /^I go to (.+)$/ do |page_name|
  #
  # step definition in web_steps.rb
  #
  def path_to(page_name)
    case page_name
    when /ユーザ登録/
      new_user_path
    else
      raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
        "Now, go and add a mapping in #{__FILE__}"
    end
  end
end

World(NavigationHelpers)

利用されている環境が Ruby 1.9 系であれば、上記ファイルにマジックコメントをつけて、日本語のエンコードを指定して下さい。

ここまで終わったらテストを実行してみます。

rake cucumber

色々と表示はされると思いますが、無事にテストが通っていれば

.........

1 scenario (1 passed)
9 steps (9 passed)
0m0.628s

このような文字が表示されているはずです。

追記

このような素敵な本も発売されています。通読しましたが、一通りのテスト方法が身に付くだけでなく Ruby/Rails 開発の知識も身に付く良い一冊だと思いました。興味のある方はぜひ。

http://tatsu-zine.com/books/2

追記の追記

Capybara で自前の http-header を仕込みたい時は、以下のアドレスの header_hacks.rb を RAILS_ROOT/features/support 以下に保存すれば問題なさそうです。

http://efreedom.com/Question/1-3399156/Using-Cucumber-Capybara-Rails-Set-Custom-User-Agent-String