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