テスト環境でマイグレーション未実行の場合にminitestとRSpecを実行するとどうなるか調べた

パーフェクト Ruby on Railsの3章でminitestについて以下のように書かれていました。

テスト環境で未実行のマイグレーションファイルがある場合でも、テスト実行時に自動でdb/schema.rbからテスト用のDB設定をロードするようになったため、基本的には作業をする必要はありません。*1

RSpecではどのような動きになるのか気になったので、minitestも含め試してみました。

minitest

  1. rails new todoでTODOリストを作成するサンプルアプリを作成
  2. rails g scaffold todo content:textでコードを生成(ここでテストコードも生成される)
  3. この時点ではまだ一度もマイグレーションを実行していないので、bin/rails testを実行するとMigrations are pending. To resolve this issue, run:rails db:migrate RAILS_ENV=testのエラーになる
  4. bin/rails db:createbin/rails db:migrateを実行。development環境に対する実行なので、テスト環境にはまだマイグレーションは適用されていない
  5. この状態でbin/rails testを実行してみるとテスト実行できた。

    Running via Spring preloader in process 23905 Finished in 0.371335s, 21.5439 runs/s, 26.9299 assertions/s. 8 runs, 10 assertions, 0 failures, 0 errors, 0 skips

RSpec

では、RSpecの場合はどうなるか。minitestで確認したときと同じ状態で、以下のRequestSpecを作成し、実行した。

require 'rails_helper'

RSpec.describe "Tasks", type: :request do
  context "index" do
    it "responds successfully" do
      get tasks_path
      expect(response).to have_http_status(200)
    end
  end
end

結果、実行することができた。

$ bin/rspec
Running via Spring preloader in process 23905
.

Finished in 0.16851 seconds (files took 0.38243 seconds to load)
1 example, 0 failures

RSpecでもminitestのようにdb/schema.rbからテスト用のDB設定をロードするようになっているのかは不明だが、テスト環境でマイグレーションを実行していなくてもテストが実行できることがわかった。

*1:schema.rbが最新ではない時などはマイグレートする必要があります。以降、パーフェクト Ruby on Railsから引用。「ただし、schema.rbが最新ではない時など、ロードした後にも未実行のマイグレーションファイルがある場合はエラーになります。その時はbin/rails db:migrateを実行してschema.rbを最新にするか、またはbin/rails db:migrate RAILS_ENV=testコマンドをつかって手動でテスト環境のマイグレーションを実行してください。」