如果我在我的 rails 项目中使用 spork 并且有这样的spec_helper.rb
文件
require 'spork'
Spork.prefork do
...
end
Spork.each_run do
...
end
这是否意味着当我通过 运行我的规格时,我需要始终运行 spork rspec spec
?意思是,如果我还没有$ spork
在终端窗口中执行,这是否意味着我的规范将无法正常运行?
如果我在我的 rails 项目中使用 spork 并且有这样的spec_helper.rb
文件
require 'spork'
Spork.prefork do
...
end
Spork.each_run do
...
end
这是否意味着当我通过 运行我的规格时,我需要始终运行 spork rspec spec
?意思是,如果我还没有$ 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) 调用命令 b) 使用选项spork
运行您的规范--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 中将guard 与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
您的代码,所以它必须在那里。为您管理的一个选项是工头,另一个选项是使用Guard和guard-spork