BETA

【Rails6/DatabaseCleaner】テストを実行する度に「rails db:environment:set RAILS_ENV=test」を求められる

投稿日:2019-09-23
最終更新:2019-09-23

Rails6環境で、DatabaseCleanerというGemを使ってテスト環境を毎回きれいにするようにしています。
そんな中、テストを複数実行すると2回目以降で以下のように怒られる現象に悩まされていました。

ActiveRecord::NoEnvironmentInSchemaError:  
Environment data not found in the schema. To resolve this issue, r  
        rails db:environment:set RAILS_ENV=test  

調べてみると、これは「DBに保存されている環境情報がないから、それを設定してね」というメッセージとこのと。
https://blog.freedom-man.com/no-environment-in-schema-error

実際、上記のコマンドを実行した後にDBを確認するとしっかり情報が入っていましたが、テストを実行した後にはきれいさっぱりになっていました。

# rails db:environment:set RAILS_ENV=test を実行した後  
mysql> select * from db_name.ar_internal_metadata;  
+-------------+-------+----------------------------+--------------  
| key         | value | created_at                 | updated_at  
+-------------+-------+----------------------------+--------------  
| environment | test  | 2019-09-23 13:21:49.081104 | 2019-09-23 13  
+-------------+-------+----------------------------+--------------  
1 row in set (0.00 sec)  

# specを実行した後  
mysql> select * from rts_test.ar_internal_metadata;  
Empty set (0.00 sec)  

これでは、確かに毎回設定しないといけません。

しかし、これはおかしな話です。
テストを回すたびに同じ環境情報を入れるなんて面倒でしかありません。

DBの情報がまっさらになっているので、DatabaseCleanerさんが悪さをしている可能性があります。
さらに調べてみると、(だいぶ古いですが)どうやらすでにissueとして報告されているようでした。
https://github.com/DatabaseCleaner/database_cleaner/issues/445
そして、最近これに関連したPRが動いているようです。
https://github.com/DatabaseCleaner/database_cleaner/pull/588
コードを見てみると、上記のar_internal_metadataを削除しないようにしてくれているようです。

しかし、執筆時点ではまだマージされていないので次のバージョンアップまで待ちましょう。
どうしても待てない!という場合は、diffを参考にコードを編集すればとりあえず回避することはできます。

今回はここまで。

おわり

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

頭は記憶リムーバブルデバイス

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう