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

不,我们的规范助手中有 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) 调用命令 b) 使用选项spork运行您的规范--drb

这对我来说很好。不过,我怎么强调都不过分,这不是必需的。只要您不通过该--drb选项,您的规格将在没有运行 spork 的情况下运行良好。我确实喜欢让它完全从我们的规范助手中分离出来,因为我已经这样做了。

于 2011-11-19T08:25:02.477 回答
4

我在 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 中将guard 与Spork 一起使用时运行。

于 2012-08-16T06:49:41.687 回答
3

根据@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,除非需要。

于 2012-07-18T10:06:27.713 回答
0

是的。因为您正在启动并要求spork您的代码,所以它必须在那里。为您管理的一个选项是工头,另一个选项是使用Guardguard-spork

于 2011-11-19T07:36:22.590 回答