On Rails 4.0.0.rc1, Ruby 2.0.0, after I run a migration, I see the following error when I try to run a test through rspec
:
/Users/peeja/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/activerecord-4.0.0.rc1/lib/active_record/migration.rb:376:in `check_pending!': Migrations are pending; run 'rake db:migrate RAILS_ENV=test' to resolve this issue. (ActiveRecord::PendingMigrationError)
That doesn't seem right. No one migrates their test database, do they? They db:test:prepare
it, which—to be fair—I've forgotten to do. So I run rake db:test:prepare
and run my rspec
command again…and see the same error.
If I actually rake db:migrate RAILS_ENV=test
, the error does in fact go away.
What's going on? Is this new in Rails 4?
rake db:test:prepare
works?
rake db:test:prepare
does not work even if schema.rb
is up to date. Only migrating the test database works.
rake db:migrate RAILS_ENV=test
solved it for me.
ActiveRecord::Migration.maintain_test_schema!
just before RSpec.configure
block in rails_helper.rb
Docs: relishapp.com/rspec/rspec-rails/docs/…
As of Rails 4.1, the rake db:test:*
tasks are deprecated. Instead, your (test|spec)_helper.rb
should include:
ActiveRecord::Migration.maintain_test_schema!
This means that your test database will get the correct schema every time your tests run, whether you run them from a Rake task or not.
Looks like rake test:prepare
works, not sure what db:test:prepare
now does.
test:prepare
is calling (depending on) db:test:prepare
. All the good stuff seems to happen outside of db:test:prepare
, though. Here's the Rails code: github.com/rails/rails/blob/…
db:test:load
which test:prepare
calls after db:test:prepare
. But it also looks like db:test:load
is invoked directly from from db:test:prepare
.
Rake::Task#invoke
shows up in the rake --trace
output, and I don't see it actually happening. Curious.
You can also try
rake db:migrate RAILS_ENV=test
which works as
db:test:prepare
does:)
rake db:migrate RAILS_ENV=test
will migrate the test database. rake db:test:prepare
will (would) load the schema into the test database, which is faster and less error-prone.
I still have trouble sometimes in sorting this problem out when I just follow one person's answer so I have thrown a couple together to get better results. Here are the steps I take, not sure which ones are unnecessary, but it works in the end.
add ActiveRecord::Migration.maintain_test_schema! to the top of the test_helper.rb file. rake test:prepare rake db:migrate rake db:migrate RAILS_ENV=test
Then when I run bundle exec rake test
I get clean results every time with no pending migrations. (This is what I do right after generating the scaffold the first time). Someone feel free to correct me if you know for sure that one of these steps is absolutely not necessary, but this is how I make sure it works every time.
I've found I have this problem when using chruby
to manage my ruby versions. Rails calls bin/rails db:test:prepare
via the system command. This doesn't take advantage of chrubys $PATH
env var, so it runs as whatever the system ruby is, and fails because of missing gems typically. Unfortunately, I don't currently have a good solution for this.
chruby
and ActiveRecord::Migration.maintain_test_schema!
simply doesn't work for me. How did you debug it? Any fixes?
You can try to set variable BEFORE command, like this. This statement solved my problem:
RAILS_ENV=test rake db:migrate
Success story sharing
rake db:create RAILS_ENV=test
to re-create your test database, and the runrake db:migrate RAILS_ENV=test
just to migrate the test database. I do this often when am yet to write tests for my application.tests_helper.rb
in rails 5 out of boxTest::Unit
(e.g. intest/test_helper.rb
)