🌊
[Ridgepole]未実行のマイグレーションがある場合、RSpec実行前に通知する
未成熟なアプリケーションであったり複数人で開発するアプリケーションではいくつものブランチがリモートにプッシュされ、マイグレーションもちょこちょこ更新されるため、スキーマが古いせいでテストが通らない、ということがあると思います。ということがあるからなのか RSpec ではテストを実行しようとした際に db:migrate
を実行していないものがある場合、RSpecが止まってマイグレーションを実行するように促してくれます。
% bin/rspec
Migrations are pending. To resolve this issue, run:
bin/rails db:migrate RAILS_ENV=test
これは ActiveRecord::Migration.check_pending! というAPIを利用した機能で、デフォルトのマイグレーション機能を利用していないと動作しません。なのでRidgepoleを使ってるアプリケーションではこの機能は動作しないです。
Ridgepole環境でもスキーマが最新でない場合はテスト実行時にスキーマが古いことをお知らせしてほしいので spec/rails_helper.rb に下記のコードを追加して、再現をしてみました。
# spec/rails_helper.rb
require 'rspec/rails'
unless `bin/ridgepole --config config/database.yml --apply --env test --dry-run`.include?('No change')
puts <<~MESSAGE
Migrations are pending. To resolve this issue, run:
bin/ridgepole --config config/database.yml --apply --env test
MESSAGE
exit 1
end
RSpec.configure do |config|
...
end
Discussion