[Ridgepole]未実行のマイグレーションがある場合、RSpec実行前に通知する

1 min read読了の目安(約900字

未成熟なアプリケーションであったり複数人で開発するアプリケーションではいくつものブランチがリモートにプッシュされ、マイグレーションもちょこちょこ更新されるため、スキーマが古いせいでテストが通らない、ということがあると思います。ということがあるからなのか 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