使用spork的Rails项目 – 总是要使用spork?

如果我在我的rails项目中使用spork并且有一个像这样的spec_helper.rb文件

 require 'spork' Spork.prefork do ... end Spork.each_run do ... end 

这是否意味着当我通过rspec spec运行我的规格时,我总是需要spork运行? 意思是,如果我还没有在终端窗口中执行$ spork ,这是否意味着我的规格将无法正常运行?

不是。我们的规范帮助器中有spork,我们不会在很多时候使用它,因为它会减慢整个套件的整体测试速度。 我们只是在快速迭代时运行spork,在TDD期间反复运行一小部分测试。 当spork没有运行时,我们只是不将--drb选项传递给RSpec,并且所有内容都在没有Spork的情况下运行。 有明显的Spork,但除非我们启动它并使用--drb运行我们的规范,否则它不会被使用。

如果你不想要prefork块和那里的东西,需要在你执行它们之前设置一个环境变量,这样你就可以有条件地绕过它们,如果它们给你造成了问题。

编辑| 我只是将我们的规范助手拆分成多个文件,因此当我们没有运行Spork时,根本没有加载prefork块。 这不是必需的,但这是我如何做到的。

spec_helper.rb在执行快速环境检查后加载两个不同文件中的一个)

 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)调用spork命令b)使用--drb选项运行规范

这对我来说很好。 但是,我不能强调,它不是必需的。 如果你没有通过--drb选项,你的规格将运行良好而不会运行spork。 我确实喜欢将它完全从我们的规范助手中分离出来,因为我已经完成了这个。

我在spec_helper.rb中这样做,这样我仍然可以在没有Spork的情况下运行RSpec:

 # 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守护时运行。

根据@ d11wtq的答案,我调整了它,所以我不必维护单独的配置文件:

 spec_helper_setup = proc do # all RSpec configuration goes in here end if /spork/i =~ $0 || RSpec.configuration.drb? require 'spork' Spork.prefork &spec_helper_setup else spec_helper_setup.call end 

是的,还有Spork.using_spork? 但这可以让它适用于两种情况,而不必加载spork gem,除非需要它。

是。 因为你在代码中启动并要求spork ,它必须在那里。 为你管理这个的一个选择是Foreman另一个选择是使用Guard with guard-spork