使用Spork重新定义常量

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。)

不确定您在警告方面的问题,但我一直在研究性能测试RSpec测试套件,因此您可能会发现这个StackOverflow答案对于您的spec_helper.rb文件有参考价值。 - Paul Fioravanti
1
我曾经见过这种情况发生,当你在规范中声明一个与生产代码中相同名称的常量时。 - Kenrick Chien
1个回答

0

使用"load"将导致文件重新加载,这意味着如果该文件定义了常量,每次加载时这些常量都将被重新定义。通常情况下,使用"require"而不是load更好,因为它通过不重新加载已经加载的文件来避免这个问题。

然而,在测试环境中,您确实希望重新加载文件,因此您可以在进行加载时抑制警告:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接