テストする時フィクスチャのリロード忘れに注意

Railsのコントローラのテストにおいて、フィクスチャのリロードをしないでテストを進めると期待通りの結果にならず首をかしげることになる。
初心者のハマリがちなところ。

例えば次のようなフィクスチャがあり

first_feed:
  id: 1
  title: hoge

次のような更新のテストを書くと

post :update, :id => @first_feed.id, :title => 'hogehoge'

@first_feed.title.should == 'hogehoge'

更新処理(updateアクション)が成功してもこのテストは失敗する。
@first_feed.titleは”hoge”のままだからだ。

期待通りの結果にするには次のようにしなくてはならない。

post :update, :id => @first_feed.id, :title => 'hogehoge'

@first_feed.reload
@first_feed.title.should == 'hogehoge'

これはなぜかというとデータベースの更新が@first_feedとは別のActiveRecordインスタンスで行われるため。たぶん。

更新処理内で同じレコードを参照する別のActiveRecordのインスタンスが作られてデータベースの更新はそちらで行われる。
他のインスタンスによる変更を既存のインスタンスであるところの@first_feedが知るすべはないので、リロードしてやらなければならないというわけだ。

というわけでフィクスチャの、と言っているが実はフィクスチャ以外でもこの現象は起こる。
でもテスト時は特にフィクスチャでよくやる。

で、初心者のハマリがちなところとか偉そうに行ってる割に自分自身が昨日これで30分くらいはまってたわけだが。

@first_feed.itemsにアクションで変更が発生したときにも@first_feedをリロードしないといけないんだぜ。
あと長時間の連続コーディングもNGなんだぜ。

前の記事

RailsでAmazon Webサービス