helen's blog

ずっとおもしろいことしてたいな。

rspecの実行環境が違うことに気づかず数時間はめられた話

データが入っているはずなのにrspecで何度実行しても

ActiveRecord::RecordNotFound

が返ってくる罠にはまっていました

状況としては、
・DBにデータが入っているのはrails dbで確認済み
irbHoge.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 しても > 返してくる(test)
・同じく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人柱終わらせて次に移りたいな