ネームスペース付きのモデルをfixutureで読み込ませる
Rails4.1.4
FactoryGirlはテストデータを作成するコストは低いけど実行時が超遅い。
なので最近は、読み込みだけのテストならfixtureを使う派になってきていまぁす。
本題。
特定のタグが付いているレコードを返すモデルのテストを書いてて、
その特定のタグもfixtureを書いていたんだけど、tagsテーブルにレコードがインサートされていないということが起こった。
ActsAsTaggableOn::Tag(gging)モデルのマッピング先テーブルを変更しているのが、トリガーになって起こったっぽい。
(マッピング先テーブルを変更している)ネームスペース付きのモデルをfixutureで読み込ませたい!
# この時こう書いてた。 describe PresenterForm fixtures :tag, :tagging, :presenter, :stap ... end
調べてみると、fixturesメソッドは正常に動いて、tagsテーブルとtaggingsテーブルにインサートされてた。
今回はタグモデルのマッピング先テーブルを変更しているので、hoge_tagsとhoge_taggingsにインサート欲しい。
(作っているアプリの要件のせいで、tagsとhoge_tags、taggingsとhoge_tagginsというテーブルが存在してる。)
結論から書くと、
1) fixtureファイルはネームスペースに従った場所におく。
spec/fixtures/acts_as_taggable_on/tags.yml spec/fixtures/acts_as_taggable_on/taggings.yml
2) fixturesメソッドの引数もネームスペースに従って書く。
describe PresenterForm fixtures 'acts_as_taggable_on/tags', 'acts_as_taggable_on/taggings', :presenters, :stap .... end
そうすることでActsAsTaggableOn:(Tag|Tagging)クラスを読み込んでくれてtable_nameを参照してくれるので掲題のことができるようになる。
ちなみに、fixturesメソッドは、「fixuturesの引数」と「ActiveRecord::Baseを継承したclass」が命名規則で一致しない場合は、
引数通りのテーブル名でinsertしていくので、冒頭のようにfixtures :tagsと書いた場合にtagsテーブルにインサートされたのでした。
テーブル名を変更しなかったら遭遇しなかった事案。