数据库清理程序不在最小的轨道中工作

如果我使用rake minitest:controllers单独运行我的Minitest控制器测试工作正常但是当我运行rake minitest:all然后我得到validation失败错误。 这是因为电子邮件已经用于模型测试。 我使用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 

简短回答:

 gem install "minitest-around" 

答案很长:

minitest中的before / after或setup / teardown 不是 rspec中的钩子,因此你不能在minitest中有多个before / after或setup / teardown,因为他们所做的只是重新定义方法。

要解决这个问题,你可以使用minitest-around ,它增加了对多个before / aftersetup / teardown支持,只需将gem添加到你的测试组:

 # 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 。

我发现了我的错误,可能对别人有帮助..

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

如果由于某种原因你不想添加’minitest-around’gem(有多个设置和拆解方法),你可以在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 

你可以用这个重复这个重复

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

此示例是spec运行器的子类,但您可以选择所选的测试环境。

这就是我喜欢Minitest的原因; 没有花哨的DSL阻止考虑如何正确使用Ruby。

我的设置如下:

test_helper.rb

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

然后我在任何需要数据库清理的测试中将其子类化。 请注意,调用super首先在任何特定于子类的设置之前清除db。 对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 

如果我需要进一步inheritanceMyTest (例如,对于集成测试),我将自己的setupteardown方法包含在对super调用中,这样它就会inheritanceinheritance树。