Cucumberをはじめてみた(つづき)
先日に引き続き、『はじめる! Cucumber』(諸橋恭介著、達人出版界、2010年、v0.9.1)の第5章以降をRuby on Rails 3でやってみました。
redirect_to :backで悩む
p.60およびp.63のウォッチを作成・削除した後、一覧に戻るため「redirect_to :back」をしていますが、なぜかこれでテストが通りません。もちろん、ブラウザで実行した場合は、きちんと戻ってくれました。
expected: "/users/bob/messages" got: "/watchings" (using ==) (RSpec::Expectations::ExpectationNotMetError) ./features/step_definitions/web_steps.rb:260:in `/^(?:|I )should be on (.+)$/' features/watching_users.feature:18:in `ならば"bobのメッセージ一覧"ページを表示していること'
そこで、リダイレクト先のURLを生成してテストを通過させました。
APP_ROOT/app/controllers/watchings_controller.rb
class WatchingsController < ApplicationController before_filter :authenticate def create watching = current_user.watchings.create!(params[:watching]) redirect_to user_messages_url(watching.watchee.login) #redirect_to :back end def destroy watching = current_user.watchings.find(params[:id]).destroy redirect_to user_messages_url(watching.watchee.login) #redirect_to :back end end
config/route.rbの書き換え
Rails 3からconfig/route.rbの書き方が変わりましたので、/users/:login名/messagesなどは以下のようにしました。
root :to => 'messages#index' resources :users do resources :messages end resources :messages do collection do get :home end end resources :sessions resources :watchings
細かい所*1
- APP_ROOT/public/index.htmlは削除しておくこと。
- 「named_scope」は、「scope」に変更。
- 「<% form_tag」だとDEPRECATION WARNINGが表示されるので、「<%= form_tag」に変更。
- p.42 リスト5.1中の「でき」は、「前提」。
- p.52 リスト5.15の前段落、「features/support/trasform.rb」は、「features/support/transform.rb」。
- 2011年2月10日9時現在、p.87 用意されたCSSのURL「http://goo.gl/YmQM」にアクセスすると404エラーが発生。本書の最初に書いてあるGitHubのURL*2からapplication.cssを取得した。
- p.90の「lib/tasks/cucumber_profile.rake」は、「lib/tasks/cucumber.rake」。
余談
PDFをA4に小冊子印刷して、半分に折り、輪ゴムで止めて勉強してました。
Railsを理解した上でなら、集中してやれば2日でやれる分量で、Cucumberのとっかかりには最適な本だと思いました。ただし、RSpecによるテストの解説は無いので、Michael Hartl氏のRuby on Rails 3 Tutorial: Learn Rails by Exampleなどが別途必要になるでしょう。
The RSpec Bookのp.10に、BDDサイクルの図が掲載されていますが、いきなり第1章でこの図を見せられてもイマイチ、私の頭には入りませんでした。
しかし、『はじめる! Cucumber』の演習部分を一通りやった後、第9章のp.92にあるBDDサイクルについて読むと(以下、抜粋)、「あ、自分ならこうテストを書いて実装するな」というイメージがわきました。
1. 外側からの受け入れ条件をCucumberで記述する
2. RSpecを使いながら内部処理を実装していく
3. Cucumberで定義している受け入れ条件を満たしているか確認する
*1:第4章以前の部分につきましては、先日書いた『Cucumberをはじめてみた』をご覧下さい。
*2:https://github.com/moro/begin-cucumber-sample/raw/master/public/stylesheets/application.css