1

RSpec テストを高速化するために spork を使用していますが、実行ごとにフィルター条件をリロードすることができません。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
4

2 に答える 2

2

Spork.each_runプリフォーク中に実行されていませんが、コードは既にメモリにロードされています。つまり、spork を再起動するまで、行った編集は表示されません。Spork は、変更時に spec_helper.rb を自動リロードしません。

これを回避するにはeach_run、必要なフィルターを指定して RSpec.configure を呼び出す別のファイルを require または load することができます。

補足として、rspec 2.8 にアップグレードすると、rspec のフィルターが spork によって破壊されるというバグに遭遇します: rspec-core #554。これは、フィルターをインラインに配置するeach_runか、外部ファイルに配置するかに関係なく発生すると思います。

于 2012-01-20T21:02:33.853 に答える
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、すべてのテスト ブロックから削除すると、すべて実行されます。再度追加するとすぐに、フラグが設定されたブロックのみが実行されます。

于 2011-11-12T13:02:33.943 に答える