【问题标题】:Redefined constants with Spork用 Spork 重新定义常量
【发布时间】:2012-12-06 19:32:16
【问题描述】:

我正在使用以下技巧(来自 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 测试套件的性能测试,因此您可能会为您的 spec_helper.rbthis StackOverflow answer /b> 文件。
  • 我已经看到当您声明一个同名的常量时会发生这种情况,但在规范而不是您的生产代码中。

标签: ruby-on-rails rspec constants spork


【解决方案1】:

使用“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

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多