Rails に入ったとたんにはまりだしたw
まず、19章で環境のセットアップが本書と異なる。
本書は Rails 3.0.0, cucumber-rails 0.3.2 となっており、自分は Rails 3.2.11, cucumber-rails は 1.3.0 をインストールした。
そうしたところ、web_step.rb
が最新の cucumber には入っていないらしい。
20章から急に駆け足になる。序盤の丁寧な説明は全くなく、サンプルコードをダウンロードして後はよろしく見てくれというスタンスっぽい。ソースコードは http://pragprog.com/titles/achbd/source_code からダウンロードできる。
おかげでいろいろハマッタのでメモしておく。
attr_accessible が必要
Rails 3.2 あたりからセキュリティ強化のため、フォームからモデルのインスタンス変数にアクセスする場合は、明示的に attr_accessible をつける必要があるらしく追加した。
model/genre.rb
class Genre < ActiveRecord::Base
has_and_belongs_to_many :movies
attr_accessible :name
end
model/movie.rb
class Movie < ActiveRecord::Base
has_and_belongs_to_many :genres
attr_accessible :title, :release_year, :genres
....
migrateに余計なカラムつけない
has_and_belongs_to_many にタイムスタンプは不要となったので削る
db/migrate/20130129180816_create_genres_movies.rb
TYPO。。。
意気揚々とrake cucumber
するもエラー。
Scenario: Create movie in genre # features/create_movie.feature:7 Given a genre named Comedy # features/step_definitions/genre_steps.rb:9 When I create a movie Caddyshack in the Comedy genre # features/step_definitions/movie_steps.rb:9 Then Caddyshack should be in the Comedy genre # features/step_definitions/movie_steps.rb:18 undefined method `movies' for #<Genre:0x007f839de03260> (ActionView::Template::Error)
どうやら、genre.moviesでエラーになっている。TYPOしてしまってhas_and_belongs_to_many :moveis
としてしまいエラーが発生していた movies に直した。
webrat じゃなくて capybara が動いていた
Then Caddyshack should be in the Comedy genre # features/step_definitions/movie_steps.rb:18
stack level too deep (SystemStackError)
features/create_movie.feature:10:in `Then Caddyshack should be in the Comedy genre'
わけわからんエラーのため、movie_step.rb に save_page を入れてって確認したところ、response.should contain("1 movie")
でエラーになっている模様。page.should have_content("1 movie")
とすることで回避できた。
どうやら、 webrat ではなく capybara が動いていたようで書き換えが必要となった。
これで何とか green になった。
エラーメッセージから修正箇所が想像しづらく、手間取ってしまった。
The RSpec Book (Professional Ruby Series)
- 作者: David Chelimsky,Dave Astels,Zach Dennis,角谷 信太郎,豊田 祐司,株式会社クイープ
- 出版社/メーカー: 翔泳社
- 発売日: 2012/02/22
- メディア: 大型本
- 購入: 6人 クリック: 129回
- この商品を含むブログ (13件) を見る