Category :

Published on :Feb 04, 2016

How would you feel if all your test that were running fine till yesterday suddenly fails? That is what happened with me this morning. Below is the exception I encountered.

$ rspec spec/
/home/prakash/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.4/lib/active_record/migration.rb:383:in `check_pending!': Migrations are pending; run 'bin/rake db:migrate RAILS_ENV=test' to resolve this issue. (ActiveRecord::PendingMigrationError)
    from /home/prakash/ATS/spec/rails_helper.rb:57:in `<top (required)>'
    from /home/prakash/.rvm/gems/ruby-2.1.1/gems/activesupport-4.0.4/lib/active_support/dependencies.rb:229:in `require'
    ...

When I saw, migrations are pending, I promptly ran rake db:migrate but nothing happened: which is a sign that there is no pending migrations. Having second look at the exception I realised that it was telling me to run migration in test environment. Like any obedient programmer I ran rake db:migrate RAILS_ENV=test and then rspec spec. Everything worked fine.

But I found it quite strange. It's already been a year that I have been coding rails and never before had I stumbled into this error. I jumped into spec/rails_helper.rb:57 in my project and saw the following.

# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.check_pending!

I searched what would check_pending! do and found this bit of code in rails repo.

# File https://github.com/rails/rails/blob/4-0-stable/activerecord/lib/active_record/migration.rb, line 382
def self.check_pending!
  raise ActiveRecord::PendingMigrationError if ActiveRecord::Migrator.needs_migration?
end

Why would anyone just throw exception instead of actually running migration if pending! I searched how to maintain test schema and found this code: ActiveRecord::Migration.maintain_test_schema!. I checked if I had similar code in my previous project and yes it was there. This might be the reason, I never bumped into any pending migration exceptions while running tests. I changed the code in spec/rails_hellper.rb and expected to have solved the problem. Things started getting interesting when I bumped into another exception.

/home/prakash/.rvm/gems/ruby-2.1.1/gems
/activerecord-4.0.4/lib/active_record/migration.rb:628:
in `block in method_missing': undefined method `maintain_test_schema!' for
#<ActiveRecord::Migration:0x0000000374fc40> (NoMethodError)

ActiveRecord::Migration.maintain_test_schema! doesn't exist in rails 4.0.4, this explains why I had not encountered this condition previously. This also explains following code in rspec:

# https://github.com/rspec/rspec-rails/blob/b8680f98858598b5423e13765676773fe587288b/lib/generators/rspec/install/templates/spec/spec_helper.rb.tt, line 15

<% if ::Rails::VERSION::STRING >= '4.1' -%>
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!

<% elsif ::Rails::VERSION::STRING >= '4' -%>
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

<% end -%>

It would be great to have migrations maintained automatically. Thus I ended up using the following code as suggested here.

ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate'))
Loading

Interested In Working Together ?

Over 8 years of industry experience in Game/Frontend
development with special interest.
Book your Consultation
© Prakash Poudel