“data_cleaner” is a beautiful gem that cleans database. We can use it for cleaning our database for each test case. I have been banging my head for hours to make it work, even though I had followed the right documentation. So I thought may be I would look “COOL” if I could write a blog describing steps, at the same time it could be helpful to other.
I would add at my Gemfile:
gem 'database_cleaner'
Then I would like to do a
bundler install
Now when database_cleaner gem is install I want to add DatabaseCleaner to my RSpec configuration, it is always a good idea to keep this code separated, so I have created a different file ‘support/database_cleaner.rb’. We need to set DataBase cleanup strategy, by default RSpec’s get/post request driven testing uses Transaction but Capybara, Selenium which is being used for testing js uses Truncation as strategy so we will need to write at least two different strategies. It is also good practice to clean up everything before we run the test so even if database had any data by mistake, it can not mess with my test cases. So my ‘support/database_cleaner.rb’ looks like:
RSpec.configure do |config| #It runs before the entire test suite runs and it clears the test database. config.before(:suite) do DatabaseCleaner.clean_with(:truncation) end # itsets the default database cleaning strategy to be transactions. config.before(:each) do DatabaseCleaner.strategy = :transaction end #Tests which is flagged as :js => true by default, these tests using Capybara # using Capybaras test server and firing an actual browser window via the Selenium # backend. For these types of tests, our previous transactions won’t work, so we need to override # the setting and chooses the “truncation” strategy instead. config.before(:each, :js => true) do DatabaseCleaner.strategy = :truncation end # Now we need to start and end database cleaner. config.before(:each) do DatabaseCleaner.start end config.after(:each) do DatabaseCleaner.clean end end
Now we need to fix few things at `rails_helper.rb`.
We will add require ‘support/database_cleaner’.
# This file is copied to spec/ when you run 'rails generate rspec:install' ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) # Prevent database truncation if the environment is production abort("The Rails environment is running in production mode!") if Rails.env.production? require 'rspec/rails' require 'spec_helper' require 'support/database_cleaner'
But still it won’t work unless we, change `rails_helper.rb` from:
config.use_transactional_fixtures = true
To:
config.use_transactional_fixtures = false
If you try to put `config.use_transactional_fixtures = false` at `spec_helper.rb` then you may need to change the order of rails and spec_helper at `rails_helper.rb`
require 'rspec/rails' require 'spec_helper'
or else you may get:
spec_helper.rb:53:in `block in <top (requir ed)>': undefined method `use_transactional_fixtures=' for #<RSpec::Core::Configuration:0x00000001d971b8>