テスト環境でマイグレーション未実行の場合にminitestとRSpecを実行するとどうなるか調べた
パーフェクト Ruby on Railsの3章でminitestについて以下のように書かれていました。
テスト環境で未実行のマイグレーションファイルがある場合でも、テスト実行時に自動でdb/schema.rbからテスト用のDB設定をロードするようになったため、基本的には作業をする必要はありません。*1
RSpecではどのような動きになるのか気になったので、minitestも含め試してみました。
minitest
rails new todo
でTODOリストを作成するサンプルアプリを作成rails g scaffold todo content:text
でコードを生成(ここでテストコードも生成される)- この時点ではまだ一度もマイグレーションを実行していないので、
bin/rails test
を実行するとMigrations are pending. To resolve this issue, run:rails db:migrate RAILS_ENV=test
のエラーになる bin/rails db:create
とbin/rails db:migrate
を実行。development環境に対する実行なので、テスト環境にはまだマイグレーションは適用されていないこの状態で
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設定をロードするようになっているのかは不明だが、テスト環境でマイグレーションを実行していなくてもテストが実行できることがわかった。