はじめに
Ruby on Railsを勉強していて度々マイグレートに悩まされることがあります。
今回はrails db:migrateを実行し、かつエラーも出ていない状態でrails testを行うとMigrations are pending. To resolve this issue, run:
bin/rails db:migrate
You have 1 pending migration:
と表示され、テストが実行できない状態になりました。
最終手段はrails db:reset
だと思います。ですがこのコマンドを実行すると保存しているデータもすべて消えてしまうため、できれば避けたいです。
環境
- Ruby 3.3.0
- Rails 7.1.3.2
- Visual Studio Code 1.87.0
- Windows11
※2024年3月5日時点の情報です。
実行したこと
①データベースをロールバックしてみる
rails db:rollback
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image.png)
成功(※画像左端の丸が青だと成功、赤だと失敗)
②再度マイグレーションを適用する
rails db:migrate
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image-1.png)
成功
・③テストを行う
rails t (test)
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image-2.png)
失敗
④ステータスを確認してみる
rails db:migrate:status
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image-3.png)
すべてup状態
結果
テスト環境のデータベースが更新されていませんでした。
Railsでは開発環境とテスト環境は別々に管理されているためデータベースも別々です。
「実行したこと」は開発環境のデータベースに対して行っていたので、何度コマンドを実行してもテスト環境のマイグレーションが適用されることはありません。
どおりでエラーが消えないわけです。
テストを実行していてエラーが出ているのですから、テスト環境の何かがおかしいということに気が付くべきでした。
①テスト環境に対してマイグレーションを適用する
rails db:migrate RAILS_ENV=test
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image-4.png)
成功
②テスト環境のステータスを確認
rails db:migrate:status RAILS_ENV=test
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image-5.png)
すべてup状態
③再びテストを行う
rails test
![](https://fukugyo-shacho.jp/wp-content/uploads/2024/03/image-6.png)
成功!
さいごに
初心者もハマらないようなことでハマってしまいました。
Railsチュートリアルに沿って作成していたのですが、開発環境ではエラーが出ていないので探しようがなく、コードも動いているな~くらいの理解度で進めていたため解消まで時間がかかりました。
コマンドを実行することでどのファイルが読み込まれているのかを理解していればもっと早く対処できていたのかもしれません。