My Minitest controller tests are working fine if I run them alone using rake minitest:controllers
but when I run rake minitest:all
then I get validation failed error. It is because email is already used in model tests. I used DatabaseCleaner to clean the database but unable to clean database.
My code for database cleaner:
require "database_cleaner"
DatabaseCleaner.strategy = :transaction
class MiniTest::Rails::ActionController::TestCase
include Devise::TestHelpers
def setup
DatabaseCleaner.start
end
def teardown
DatabaseCleaner.clean
end
Short answer:
gem install "minitest-around"
Long answer:
before/after or setup/teardown in minitest are NOT hooks as in rspec, therefore you can't have multiple before/after or setup/teardown in minitest, since what they do is just redefining the method.
To solve this issue, you can use minitest-around
, which adds support for multiple before
/after
or setup
/teardown
and around
, simply add the gem to your test group:
# put in your Gemfile
gem 'minitest-around', group: :test
For setting up the database_cleaner, you can have it as you want, following is an example of the setup:
# tests/support/database_cleaner.rb
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
class Minitest::Rails::ActionController::TestCase
def setup
DatabaseCleaner.start
end
def teardown
DatabaseCleaner.clean
end
end
And in your test files:
# tests/your/test/file_test.rb
require 'support/database_cleaner'
# assertions here ...
That's it, see the Github for detailed info.