如何让spork尊重我的运行过滤器?

时间:2011-11-11 11:25:13

标签: ruby-on-rails rspec spork

我正在使用spork来加速我的RSpec测试但是我不能让它在每次运行时重新加载过滤条件,例如config.filter_run_excluding :slow => true

无论我是否将这些过滤器放入Spork.each_run块中,它们似乎只是在第一次启动时才会被加载,这很痛苦。

是否有可能每次都重新解释它们?

我的spec_helper文件:

require 'rubygems'
require 'spork'
require 'shoulda/integrations/rspec2'


Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'shared/test_macros'
  require 'shared/custom_matchers'
  require "email_spec"

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.include(TestMacros)
  end
end

Spork.each_run do
  RSpec.configure do |config|
    # THESE ONLY SEEM TO BE INTERPRETED DURING PRE-FORK
    config.filter_run_excluding :slow => true
    config.filter_run :now => true
  end
end

2 个答案:

答案 0 :(得分:2)

在prefork期间没有运行

Spork.each_run,但代码已经加载到内存中。这意味着在重新启动spork之前,不会看到您所做的任何编辑。 Spork在更改时不会自动重新加载spec_helper.rb。

要解决此问题,您可以让each_run要求或加载另一个使用所需过滤器调用RSpec.configure的文件。

作为旁注,如果你升级到rspec 2.8,你将遇到一个错误,其中rspec的过滤器被spork:rspec-core #554破坏了。我相信无论你是否将过滤器内联在each_run或外部文件中,都会发生这种情况。

答案 1 :(得分:0)

虽然技术上并不是我问的问题的答案,但我找到了解决方法。

我本来想做的是偶尔关注几个tets,即使用config.filter_run :now => true,然后在通过时再回到运行所有测试。我发现你可以通过添加以下不言自明的配置行来实现这一点:

config.run_all_when_everything_filtered = true

each_run

中的后续spec_helper阻止
RSpec.configure do |config|
  # restrict tests to a particular set
  config.filter_run_excluding :slow => true
  config.filter_run :now => true
  config.run_all_when_everything_filtered = true
end

当没有一个测试通过过滤器符合条件时,它会执行所有测试。即如果您从所有测试块中删除:now => true,那么它们将全部运行。只要再次将其重新添加,标记的块就会运行。