我正在使用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
答案 0 :(得分:2)
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
,那么它们将全部运行。只要再次将其重新添加,标记的块就会运行。