Rails3.0 + Cucumber 0.9.1 + cucumber-rails 0.3.2 の優しい育て方

ちょっと先日人前で話す機会があり、調べていたのですが

日本語でかかれた情報がない
日本語でのfeatureの書き方が本家にmergeされた

みたいなのですが、どこにも情報がなかったのでまとめておきます。

Rails用のセットアップ

Rails3.0以降からgemファイルのセットアップはRAILS_ROOT/Gemfileに必要とするgemを記述してインストールします。特に本番環境を複数用意した時に、gemのインストールミスを防ぐという意味合いもあるとのことです。rails-cucumberのREADMEだけでは実行時にエラーがでたので、ramazeとwebratを増やしてあります。*1

:RAILS_ROOT/Gemfile
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' # So you can do Then show me the page
gem 'ramaze'
gem 'webrat'
end

と記述した後に以下のコマンドを実行します

$ bundle install

ただし、この場合にはsystem側のgemsにはいってしまうので、環境が汚染されてしまいます。Railsの推奨の設定では、RAILS_ROOT/vendor/bundleにいれることを推奨しています。

$ bundle install vendor/bundle

以降再度実行の際には、引数でインストール先の指定がいらなくなります。RAILS_ROOT/.bundle/configにインストール先が記述されています。

cucumberのRails Projectへのインストール

cucumberのRails Projectへのインストールは、script/railsのgeneratorをつかってインストールします。日本語のfeatureを利用する場合にはこの段階で引数で言語を指定します。また、rpsecを利用する時には--rspecを指定し、webアクセス時のjavascriptの解釈のためにcapybaraを使うので--capybaraを指定します。

$ ruby script/rails generate cucumber:install ja --rspec --capybara

cucumber-rails-0.3.2/generators/cucumber/USAGEにしか言語オプションについて書いていませんので注意。generatorのソース直でよんでも分かりますけどね。*2

featureのgenerate

次にやっとfeatureをインストールします。

$ ruby script/rails generate cucumber:feature user

これで一通りは動きます。実際にはdbのsetupをしてない場合には

$ rake db:migrate

などとしないと動きませんが……。

featureを作るときにmodelのcolumnを指定する

featureを作るときにmodelのcolumnを指定すると、自動的にそのcolumn用のtestingのシナリオを書いてくれます。

$ ruby script/rails generate cucumber:feature user name:string mailaddress:string

こんな感じです。

日本語のシナリオの作成

jaを指定することで日本語のシナリオを作成できますが、普通にかくと動きません。ソースを追っておくと、言語指定をシナリオファイルの最初にかかないといけないっぽいです。

$cat features/manage_posts.feature
# language: ja
フィーチャ: 新規登録
シナリオ: 新規登録
...

と一行目に

# language: ja

と記述する必要があります。これで他のサンプルをみながら日本語のシナリオをかけばOKです。

cucumberの実行方法

script/cucumberなどというファイルができますが、rakeの中にタスクとして登録されています。

$ rake cucumber

とすればOKです。

path.rbでエラーがおきる時

シナリオを日本語で記述した時に、path.rbでエラーがでます。

$ rake cucumber
(in /Users/yuunyan/work/cuke-test)
bundle exec /Users/yuunyan/work/.rvm/rubies/ruby-1.9.2-p0/bin/ruby -I "/Users/yuunyan/work/.rvm/gems/ruby-1.9.2-p0/gems/cucumber-0.9.1/lib:lib" "/Users/yuunyan/work/.rvm/gems/ruby-1.9.2-p0/gems/cucumber-0.9.1/bin/cucumber" --profile default
Using the default profile...
/Users/yuunyan/work/cuke-test/features/support/paths.rb:10: invalid multibyte char (US-ASCII)
/Users/yuunyan/work/cuke-test/features/support/paths.rb:10: invalid multibyte char (US-ASCII)
/Users/yuunyan/work/cuke-test/features/support/paths.rb:10: syntax error, unexpected $end, expecting keyword_then or ',' or ';' or '\n'
when /新規登録/
^ (SyntaxError)

という場合にはおきまりの

features/support/path.rb
#encoding: utf-8

をつければ解決します。単に文字コードが解釈できないだけですねw

とりあえずこれで優しくBDDなりTDDがはじめることができます。是非みなさまもチャレンジしてみてね!

これよんでるよ

The RSpec Book: Behaviour Driven Development with RSpec, Cucumber, and Friends

Rspecの本!英語しかないけどebookでもあるのでオススメですよ〜。

*1:もしかしたらwebratはいらないかも

*2:当然、helpにはでるけどどういう値あたえたらいいのかわからない脆弱性