6

Rails プロジェクトで spork を使用していて、spec_helper.rbこのようなファイルがあるとします。

require 'spork'

Spork.prefork do
  ...
end

Spork.each_run do
  ...
end

経由でスペックを実行するときは、常に spork を実行する必要があるということrspec specですか? つまり$ spork、ターミナル ウィンドウでまだ実行していない場合、仕様が正しく実行されないということですか?

4

4 に答える 4

11

いいえ。spec ヘルパーに spork がありますが、大規模なスイートでは全体的にテストが遅くなるため、あまり使用しません。迅速に反復し、TDD 中にテストの小さなサブセットを繰り返し実行する場合にのみ、spork を実行します。spork が実行されていないときは、単純に--drbオプションを RSpec に渡さず、すべてが Spork なしで実行されます。明らかな Spork がありますが、それを開始して--drb.

prefork ブロックなどをそこに置きたくない場合は、それらを実行する前に環境変数を設定する必要があります。これにより、問題が発生している場合に条件付きでそれらをバイパスできます。

編集 | Spork を実行していないときは prefork ブロックがまったく読み込まれないように、spec ヘルパーを複数のファイルに分割しました。必要ありませんが、私がやった方法は次のとおりです。

spec_helper.rb は、簡単な環境チェックを行った後、2 つの異なるファイルのいずれかをロードします)

ENV["RAILS_ENV"] ||= 'test'

# Conditional Spork.prefork (this comment is needed to fool Spork's `bootstrapped?` check)
if /spork/i =~ $0 || RSpec.configuration.drb?
  require File.expand_path("../spec_helper_spork", __FILE__)
else
  require File.expand_path("../spec_helper_base", __FILE__)
end

spec_helper_base.rb は、Spork を含まない元の spec_helper の単なるコピーです (Spork を削除した場合は、名前を元に戻すことができます)。

ENV["RAILS_ENV"] ||= 'test'

require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'database_cleaner'

# Load all .rb helper files under the support/ directory
Dir[Rails.root.join("spec/support/**/*.rb")].each { |file| require file }

RSpec.configure do |config|
  # ... the usual stuff ...
end

最後に、spec_helper_spork.rb は、spec_helper_base.rb の単なるラッパーです。

require 'spork'

Spork.prefork do
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'database_cleaner'
end

Spork.each_run do
  $rspec_start_time = Time.now
  require File.expand_path("../spec_helper_base", __FILE__)
end

spec_helper_spork.rb が読み込まれるのは、次の場合のみです。

a) コマンドを呼び出すb)オプションsporkを指定して spec を実行する--drb

これは私にとってはうまくいきます。しかし、それが必要ないことを十分に強調することはできません。--drbとにかくオプションを渡さない限り、spork が実行されていなくても Spec は正常に実行されます。私はこれを行ったので、spec ヘルパーから完全に分割するのが好きです。

于 2011-11-19T08:25:02.477 に答える
4

Spork なしで RSpec を実行できるように、spec_helper.rb でこれを行います。

# spec/spec_helper.rb
if Spork.using_spork?
  Spork.prefork do
    # Loading more in this block will cause your tests to run faster. However,
    # if you change any configuration or code from libraries loaded here, you'll
    # need to restart spork for it take effect.
  end 

  Spork.each_run do
    FactoryGirl.reload
  end
end

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

RSpec.configure do |config| 
  # usual RSpec config stuff
end

私はこれを Guard-spork gem と一緒に使用するので、if ブロック内のものは、Guardfile で Spork と一緒に Guard を使用した場合にのみ実行されます。

于 2012-08-16T06:49:41.687 に答える
0

はい。起動しsporkてコードで要求しているため、そこにある必要があります。それを管理するための 1 つのオプションはForemanです。もう 1 つのオプションは Guard -sporkでGuardを使用することです。

于 2011-11-19T07:36:22.590 に答える