如果我在rails项目中使用spork,并且有一个如下所示的spec_helper.rb文件
require 'spork'
Spork.prefork do
...
end
Spork.each_run do
...
end这是否意味着当我通过rspec spec运行我的规范时,我需要总是运行spork?也就是说,如果我还没有在终端窗口中执行$ spork,这是否意味着我的规范将无法正常运行?
发布于 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在执行快速环境检查后加载两个不同文件中的一个)
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__)
endspec_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的情况下运行得很好。我确实喜欢它完全从我们的规范助手中分离出来,因为我已经做到了这一点。
发布于 2012-08-16 14:49:42
我在spec_helper.rb中这样做,这样我仍然可以运行RSpec,而不需要Spork:
# 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-07-18 18:06:28
根据@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,除非需要。
https://stackoverflow.com/questions/8192636
复制相似问题