Hatena::ブログ(Diary)

nkmrshnの日記

2011-02-09

Cucumberをはじめてみた

昨日、『はじめる! Cucumber』(諸橋恭介著、達人出版界、2010年、v0.9.1)を買い、本のタイトルどおり、Cucumberを勉強しはじめました。とりあえず、第4章までやってみたので、Ruby on Rails 3での注意点など書きたいと思います。第5章以降は、また後日

プロジェクトの作成

プロジェクト作成時、「-T」を付けてTest::Unitファイルの作成をスキップ。

$ rails new cuke-handson -T

Gemfile

gemコマンドでインストールするcucumberなどを、Gemfileに追加し、「bundle install」。

group :development do
  gem 'rspec-rails'
  gem 'cucumber-rails'
  gem 'i18n_generators'
end

group :test do
  gem 'rspec'
  gem 'cucumber'
  gem 'webrat'
  gem 'launchy'
end

読み替え

ruby script/generateは、rails generateに。例えば:

$ ruby script/generate cucumber ja --webrat --rspec

これを、以下のように読み替えて実行しました。

$ rails generate cucumber ja --webrat --rspec

Webratのバグ修正*1

Webratがインストールされているディレクトリ*2にある、lib/webrat/core/session.rbを修正。

def current_host
  URI.parse(current_url).host || @custom_headers["Host"] || default_current_host
end

def default_current_host
  adapter.class==Webrat::RackAdapter ? "example.org" : "www.example.com"
end 

Cucumberのバグ修正*3

APP_ROOT/features/support/env.rb

require 'webrat'
require 'webrat/core/matchers'

Webrat.configure do |config|
  config.mode = :rack
  config.open_error_files = false # Set to true if you want error pages to pop up in the browser
end

World(Webrat::Methods)
World(Webrat::Matchers)

細かい所

  • 本書はRSpecによるテストは無いのですが、「bundle install」した後、「rails generate rspec:install」を実行。
  • p.7の「RAILS_ENV=cucumber rake gems:install」はやらなかった。
  • p.21でi18nジェネレータを実行すると、config/application.rbを上書きしようとするので「Y」をする。
  • p.22でapp/views/messages/new.html.erbを編集しているけど、同ディレクトリの_form.html.erbを編集する。
  • HTTP_ACCEPT_LANGUAGEヘッダを参照するはずなのに、p.24のlocalized_steps.rbで「HTTP_」が抜けてる。
  • p.31のi18n_scaffoldが動かない。本書とは関係ありませんが、i18nジェネレータのlib/generatorsにi18n_scaffoldがないんですが...なんでだろう?
  • p.32-33のヘルパーをApplicationHelperに書き、ApplicationControlerでincludeした。
  • 「rake db:migrate」した後は、「rake db:test:prepare」した。本書には書いてないんですが、これって必要なかったのかなぁ...*4

余談

RSpecとCucumberの棲み分けというか、使い方の違いが段々と実感できるようになってきました。これはあくまでも私の主観で、間違っているかもしれませんが、Selenium IDEでやることをCucumberでやってる感じかなぁ...

*1Webrat and Rails: Using assert_contain after click_button gives me “You are being redirected”

*2:「$ bundle show webrat」でわかります。

*3undefined method `visit' for cucumber

*4:(2/10追記)APP_ROOT/lib/tasks/cucumber.rakeで、db:test:prepareしているので必要なかった。