rspecの実行環境が違うことに気づかず数時間はめられた話
データが入っているはずなのにrspecで何度実行しても
ActiveRecord::RecordNotFound
が返ってくる罠にはまっていました
状況としては、
・DBにデータが入っているのはrails dbで確認済み
・irbでHoge.find(1)で取得できることは確認済み
・なのにspecで @hoge = Hoge.all しても
・同じくspecで @hoge = Hoge.find(1) しても ActiveRecord::RecordNotFound
という謎現象でした
私「データはあるのにひろえません(>_<、)」
先生「なんだこれ...」
鬼軍曹「環境の問題じゃね?」
先生・私「アッ」
謎現象も何も、タイトルにある通りRAILS_ENVの問題でした
・DBにデータが入っているのはirbで確認済み(development)
・irbでHoge.find(1)で取得できることは確認済み(development)
・なのにspecで @hoge = Hoge.all しても
・同じくspecで @hoge = Hoge.find(1) しても ActiveRecord::RecordNotFound(test)
確認しているDBとspecで使うDBが違うからデータが取れないっていう
たったそれだけのことでした。
先生「へれんがirbとdbでデータはあるって見せるから...」(^▽^#)
私「ヒィ」( ̄ロ ̄;)
それを見ていた司令官からの有難いお言葉をいただきました
>rspecしている方
rspecの実行時にどんなデータで動いているかを確認したいときは、
あらかじめ「RAILS_ENV=test」を指定して rake db:seed を実行&、mysqlで確認
をすると良いかもです。例1)
RAILS_ENV=test bundle exec rake db:seed例2)
ONLY_SEED_NAME=hoge_spec RAILS_ENV=test bundle exec rake db:seed
だがしかし
developmentのデータをtestに移すのすら面倒くさい私は
RAILS_ENV=development bundle exec rspec spec
私「逃げました」
鬼軍曹「ばかすwwww」
司令官「かしこい」
私 ☆(ゝω・)vキャピ
specで参照するだけならdevelopmentで問題ないのでは、、、ということで
mysqldumpするのすらめんどくさかっただけだけど
もっと早く相談していればよかったのと、
もっと早く気付けよという自戒を込めて
明日こそmock人柱終わらせて次に移りたいな