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

Ani*_*rya 7 ruby ruby-on-rails-3.2 database-cleaner

如果我单独使用rake minitest:controllers它,我的Minitest控制器测试工作正常,但是当我运行时,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
Run Code Online (Sandbox Code Playgroud)

Hen*_*zia 13

简短回答:

gem install "minitest-around"
Run Code Online (Sandbox Code Playgroud)

答案很长:

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

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

# put in your Gemfile
gem 'minitest-around', group: :test
Run Code Online (Sandbox Code Playgroud)

要设置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
Run Code Online (Sandbox Code Playgroud)

在您的测试文件中:

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

# assertions here ...
Run Code Online (Sandbox Code Playgroud)

就是这样,有关详细信息,请参阅Github.

  • 请注意,您可以通过在子测试的`setup`方法中调用`super`来进行多次'设置'. (2认同)

djb*_*djb 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
Run Code Online (Sandbox Code Playgroud)