Rails 4: How to reset test database?

Ruby on-RailsRubyRspec

Ruby on-Rails Problem Overview


I'm on Rails 4 and have noticed some of my RSpec tests are failing because some of my test refactorings use a before filter (presumably because of transactions). This post describes a similar issue:

https://stackoverflow.com/questions/16268728/rails-test-database-not-clearing-after-some-runs

In lieu of using the DatabaseCleaner gem, is there a rake command to clear out the test database? I believe rake db:test:prepare is deprecated in Rails 4. Also, if before transactions like

`post :create, user: Fabricate.attributes_for(:user)`

are persistent, is there an alternative way of refactoring to avoid the need to manually clear out the test database?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

An overkill solution would be:

bundle exec rake db:drop RAILS_ENV=test
bundle exec rake db:create RAILS_ENV=test
bundle exec rake db:schema:load RAILS_ENV=test

You could make this all in a rake task and run that.

Another solution from here is to include the following your spec_helper.rb file

config.after :all do
  ActiveRecord::Base.subclasses.each(&:delete_all)
end

Disclaimer: I have not tested this and you should read the SO post as it may not work in all situations.

That being said, I would recommend using the database cleaner gem to avoid situations such as this.

Solution 2 - Ruby on-Rails

It can be:

(For rails Rails 5+)

bundle exec rails db:reset RAILS_ENV=test

For previous versions

bundle exec rake db:reset RAILS_ENV=test

Solution 3 - Ruby on-Rails

Sometimes you might need to run this command (optional)

rails db:environment:set RAILS_ENV=test

But for sure to wipe out your test database should be as easy as:

rails db:drop db:create db:migrate RAILS_ENV=test

Solution 4 - Ruby on-Rails

You can add an after filter deleting all the entries from the concerned tables.

Solution 5 - Ruby on-Rails

In theory this ActiveRecord::Migration.maintain_test_schema! should do the trick. Put it in rails_helper.rb

Solution 6 - Ruby on-Rails

I ended up writing a simple rake task that drops/migrates (or drops & migrates) all test and development databases, depending on the command executed.

It includes functionality to prompt the user as to whether they would like to continue when an error occurs, and uses Open3's popen3 method (such that we can access stdin, stdout and stderr; and any failed commands don't result in the rake task's process aborting (unlike when using system)).

Hopefully this helps someone. :)

https://github.com/xtrasimplicity/rake_all_db_helper/

edit: This will need to be manually executed from your shell, whenever you would like to clear your database, however.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSolomons_EcclesiastesView Question on Stackoverflow
Solution 1 - Ruby on-RailsChrisBartholView Answer on Stackoverflow
Solution 2 - Ruby on-RailsmpzView Answer on Stackoverflow
Solution 3 - Ruby on-Railsd1jhoni1bView Answer on Stackoverflow
Solution 4 - Ruby on-RailsnbirlaView Answer on Stackoverflow
Solution 5 - Ruby on-RailstomrView Answer on Stackoverflow
Solution 6 - Ruby on-RailsXtraSimplicityView Answer on Stackoverflow