rspec-railsでのAR::PendingMigrationError時のバックトレースを消す

元ネタは Rails 5.2 で入る kirs さんによる以下の PR となる。

github.com

たとえば、RSpec でテストを実行しようとした際に db:migrate を実行していないものがあるときの振る舞いが以下のとおりになる。

% bin/rspec
Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test

これまではこの後に読むことのないバックトレースがだらっとついていたので、ノイズが減って良いと思う。

Rails 標準で採用されていない RSpecRails アプリケーションを開発しているケースでは rspec-rails を使っていると思うが、spec/spec_helper.rb か spec/rails_helper.rb で ActiveRecord::Migration.check_pending! あるいは ActiveRecord::Migration.maintain_test_schema! を使っている箇所があれば、以下のように変更することで同様の対応となる。

-ActiveRecord::Migration.check_pending!
+begin
+  ActiveRecord::Migration.check_pending!
+rescue ActiveRecord::PendingMigrationError => e
+  puts e.to_s.strip
+  exit 1
+end

既存の Rails アプリケーションに関してはこのような diff を入れておくと良い。さらに言うと Rails 5.2 へのアップグレードと独立した話なので、いまからでも既存の Rails アプリケーションの spec/spec_helper.rb に手を入れておけば良いと思う。

新規については rspec-rails のテンプレートの方には PR を出してマージされているので、次の rspec-rails 3.7.3 あたりでのテンプレートからそのようになる予定。

github.com