在Rails 4.2下不使用固定装置进行特定的单元测试

时间:2015-04-18 21:09:29

标签: ruby-on-rails unit-testing ruby-on-rails-4

我的套件中有一些测试,绝对需要一个空的数据库才能运行。

事实上,rails会自动加载每个测试的灯具,我似乎无法找到让它不能加载这个特定测试的方法。

我可以在每次测试之前删除数据库,但这很慢并且需要所有其他测试,这些测试需要灯具后来重新加载灯具。

有没有办法让某个测试类(即“NoFixturesTest”)不加载灯具(或卸载它们),而不会破坏所有其他测试?

谢谢!

编辑:

感谢下面的答案,我做到了:

module DisableFixturesHelper
    def self.included(base)
        base.setup :setup_drop_db

        # Have a unit test double-check that the fixtures are really gone
        base.test "0 fixtures not loaded" do
            assert_equal 0, Table1.count, "Table1 isn't empty!"
            #etc
        end
    end

    # Call to reset the db and therefore disable fixtures during a single unit test
    def setup_drop_db
        Rails.logger.info { "Dropping database." }
        DatabaseCleaner.clean_with :truncation
    end
end

然后在需要空数据库(没有灯具)的TestCase中,我添加

include DisableFixturesHelper

这样做的问题是,每次测试都会丢弃数据库,在已经加载灯具之后,所以它真的很慢。它确实在每个单元测试开始之前重新加载灯具,只是为了放弃它们。

仍然有效。

1 个答案:

答案 0 :(得分:0)

你知道DatabaseCleaner ???

吗?

也许它可以提供帮助,你也可以定义什么不删除

类似的东西:

DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}

这是我一直使用的初始化程序:

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.append_after(:each) do
    DatabaseCleaner.clean
  end
end