数据库清理程序不在最小的轨道中工作
如果我使用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
/ after
或setup
/ 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
(例如,对于集成测试),我将自己的setup
和teardown
方法包含在对super
调用中,这样它就会inheritanceinheritance树。