首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用spork的Rails项目--总是要使用spork吗?

使用spork的Rails项目--总是要使用spork吗?
EN

Stack Overflow用户
提问于 2011-11-19 15:33:50
回答 4查看 3.6K关注 0票数 6

如果我在rails项目中使用spork,并且有一个如下所示的spec_helper.rb文件

代码语言:javascript
复制
require 'spork'

Spork.prefork do
  ...
end

Spork.each_run do
  ...
end

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-19 16:25:02

不是的。我们的spec helper中有spork,我们不经常使用它,因为它会减慢大型套件的整体测试速度。我们只在快速迭代时运行spork,在TDD期间重复运行一小部分测试。当Spork没有运行时,我们不会将--drb选项传递给RSpec,所有的东西都会在没有spork的情况下运行。很明显,Spork就在那里,但除非我们启动它并使用--drb运行我们的规范,否则它不会被使用。

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

编辑|我刚刚将我们的spec helper分成了多个文件,所以当我们不运行Spork时,prefork块根本不会被加载。这不是必需的,但我是这样做的。

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

代码语言:javascript
复制
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,您可以将其重命名)

代码语言:javascript
复制
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的一个包装器

代码语言:javascript
复制
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的情况下运行得很好。我确实喜欢它完全从我们的规范助手中分离出来,因为我已经做到了这一点。

票数 11
EN

Stack Overflow用户

发布于 2012-08-16 14:49:42

我在spec_helper.rb中这样做,这样我仍然可以运行RSpec,而不需要Spork:

代码语言:javascript
复制
# 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时才会运行。

票数 4
EN

Stack Overflow用户

发布于 2012-07-18 18:06:28

根据@d11wtq的回答,我对它进行了调整,这样我就不必维护单独的配置文件:

代码语言:javascript
复制
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,除非需要。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8192636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档