8

如果我单独运行它们,我的 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
4

5 回答 5

14

简短的回答:

gem install "minitest-around"

长答案:

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

要解决这个问题,您可以使用minitest-around增加对多个before/aftersetup/teardown的支持around,只需将 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

于 2015-02-16T10:36:34.147 回答
5

如果出于某种原因您不想添加“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
于 2018-03-02T19:56:34.547 回答
4

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

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

于 2013-03-28T08:56:28.497 回答
2

这就是我喜欢 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进一步子类化(例如,用于集成测试),我会在调用中包含它自己的setup&方法,以便它直接向上继承树。teardownsuper

于 2018-08-04T00:56:12.413 回答
0

你可以用这个干掉那个重复

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

此示例继承了规范运行程序,但您可以选择您选择的测试环境。

于 2014-07-17T13:23:52.853 回答