-->

数据库清理中MINITEST轨道不工作(Database Cleaner not working i

2019-08-18 02:42发布

如果我运行它们单独使用我的MINITEST控制器测试,工作正常rake minitest:controllers但是当我运行rake minitest:all然后我得到验证失败错误。 这是因为电子邮件是在模型试验已被使用。 我用DatabaseCleaner清理数据库,但无法清除数据库。

我对数据库清理代码:

require "database_cleaner"
DatabaseCleaner.strategy = :transaction

class MiniTest::Rails::ActionController::TestCase
    include Devise::TestHelpers

    def setup
      DatabaseCleaner.start
    end

    def teardown
      DatabaseCleaner.clean
    end

Answer 1:

简短的回答:

gem install "minitest-around"

长一点的回答:

前/或安装/拆卸后MINITEST 挂钩,如RSpec的,所以你不能在MINITEST多前/后或安装/拆卸,因为他们做什么,只是重新定义方法。

为了解决这个问题,你可以使用minitest-around ,增加了支持多before / aftersetup / teardownaround ,只需将宝石添加到您的测试组:

# put in your Gemfile
gem 'minitest-around', group: :test

有关设置database_cleaner,你可以拥有它,只要你想,下面是设置的例子:

# 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

并在测试文件:

# tests/your/test/file_test.rb
require 'support/database_cleaner'

# assertions here ...

就是这样,看到Github上的详细信息。



Answer 2:

我发现我的错误,可能是它可以帮助别人..

我应该写DatabaseCleaner.start在设置定义每一个模型试验的设置,因为我在每一个测试文件覆盖安装方法。



Answer 3:

如果出于某种原因你不想加入“MINITEST全能”宝石(有超过一个的安装和拆卸方法),你可以在你做到这一点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


Answer 4:

这就是为什么我喜欢MINITEST; 没有花哨的DSL阻止思考如何正确使用Ruby。

我的设置如下:

test_helper.rb

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

  def teardown
    DatabaseCleaner.clean
  end
end

然后,我只是在需要清理数据库的任何测试继承这一点。 注意调用super第一清除任何特定的子类,设置之前的分贝。 同一呼叫的super将需要包括在任何子类teardown方法,但通常可以完全省略。

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

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

如果我需要继承MyTest进一步(例如,用于集成测试),我有自己的setupteardown与调用方法super所以它就会从继承树。



Answer 5:

你可以干起来这个是重复

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

这个例子子类规范亚军,但你可以选择您选择的测试环境。



文章来源: Database Cleaner not working in minitest rails