5

我正在使用以下技巧(来自http://mikbe.tk/2011/02/10/blazingly-fast-tests/)来确保在使用 Spork 运行的每个 RSpec 上重新加载模型:

Spork.each_run do
  load "#{Rails.root}/config/routes.rb"
  Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
  # .....
end

但是,每次我运行测试时它都会导致以下警告:

/myproject/app/models/model.rb:36: warning: already initialized constant CONFIGURABLE

我可以通过放置来避免:

if !defined?(A_CONSTANT)

在每个常数之后,这看起来并不正确(但它有效)。关于如何使这项工作正常工作的任何建议?(即我的模型仍会在测试中重新加载,但我不必if在每个常量定义之后添加。)

4

1 回答 1

0

使用“load”将导致文件被重新加载,这意味着如果该文件定义了常量,则每次加载时都会重新定义这些常量。通常首选使用“require”而不是加载,因为如果文件已经加载,它不会重新加载文件,从而避免了这个问题。

但是,显然您确实想在测试环境中重新加载文件,因此您可以在加载时抑制警告:

Spork.each_run do
  Kernel.silence_warnings do
    load "#{Rails.root}/config/routes.rb"
    Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
    # .....
  end
end
于 2015-09-04T19:12:06.070 回答