【问题标题】:Rails project using spork - always have to use spork?使用 spork 的 Rails 项目 - 总是必须使用 spork?
【发布时间】:2011-11-19 07:33:49
【问题描述】:

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

require 'spork'

Spork.prefork do
  ...
end

Spork.each_run do
  ...
end

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

【问题讨论】:

  • 尝试在不启动 spork 的情况下执行 rspec spec 并观察输出。它会说“Drb 服务器未运行,而是使用本地进程”。
  • 我明白了。您担心将配置代码移至 spork 块。对?没关系。一切都将被配置好。
  • @ArtShayderov,只有在使用 --drb 运行规范时才会发生这种情况。如果您不想在特定运行中使用 Spork,则不应使用 --drb 运行它们。
  • 刚刚在我的答案中添加了一些代码,您可以采取一种方法将您的 spork 东西与您的主要规范助手分开。
  • @d11wtq 是一样的。在不带 spork 的情况下使用 --drb 运行或在不使用 --drb 的情况下运行。我认为这可能是这个输出(“使用本地进程”)将清除 OP 的问题。

标签: ruby-on-rails ruby rspec spork


【解决方案1】:

没有。我们的规范助手中有 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 的情况下运行良好。我确实喜欢让它完全从我们的规范助手中分离出来,因为我已经这样做了。

【讨论】:

  • 所以即使我在 spork preforkeach_run 块中有东西,只要我在没有 --drb 选项的情况下运行 rspec,一切都会像没有 spork 的情况下一样工作?跨度>
  • 您现在可以使用更明确的Spork.using_spork? 来环绕您的Spork.preforkSpork.each_run 块,而不是/spork/i =~ $0 || RSpec.configuration.drb?,但请确保在spec_helper.rb 中包含“spork”跨度>
【解决方案2】:

我在 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 的guard 时运行。

【讨论】:

    【解决方案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,除非需要。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果 spork 没有运行,没有办法喜欢“跳过”prefork 和 each_run 块,这对我来说似乎很奇怪。
      • 好吧,您可以使用 Process 类来确定 spork 是否正在运行,并且只需要 'spork' 并在运行时执行块。但是后卫总体上非常棒,似乎是一个更好的选择
      猜你喜欢
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多