Database Cleaner not working in minitest rails

怎甘沉沦 提交于 2019-11-30 20:12:54

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.

I found my mistake ,may be it helps someone else ..

I should write DatabaseCleaner.start in setup of every model test where setup is defined, as i am overwriting setup method in every test file.

If for whatever reason you don't want to add the 'minitest-around' gem (to have more than one setup and teardown method), you can do this in your test_helper.rb...

require "database_cleaner"
DatabaseCleaner.strategy = :transaction

module AroundEachTest
  def before_setup
    super
    DatabaseCleaner.start
  end

  def after_teardown
    super
    DatabaseCleaner.clean
  end
end

class Minitest::Test
  include AroundEachTest
end

This is why I like Minitest; no fancy DSL to block thinking about how to use Ruby properly.

My setup is as follows:

In test_helper.rb

class MyTest < Minitest::Test
  def setup
    DatabaseCleaner.start
  end

  def teardown
    DatabaseCleaner.clean
  end
end

Then I just subclass this in any test that need database cleaning. Note the call super first cleans the db before any subclass-specific setup. The same call to super would need to be included in any subclass teardown method, but this can usually be omitted entirely.

class FooTest < MyTest
  def setup
    super
    @foo = Foo.new(bar: 'whatever')
  end

  def test_save
    @foo.save
    assert_equal 1, Foo.count
  end
end

If I need to subclass MyTest further (e.g. for integration tests) I include its own setup & teardown methods with calls to super so it goes right up the inheritance tree.

You can DRY up that repetition with this

DatabaseCleaner.strategy = :truncation
class MiniTest::Spec
  before :each do
    DatabaseCleaner.clean
  end
end

This example subclasses the spec runner, but you can pick your test environment of choice.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!