【问题标题】:Rails autoloading behaves strangely in RSpec with modules and subclasses with sporkRails 自动加载在 RSpec 中的行为很奇怪,带有模块和带有 spork 的子类
【发布时间】:2013-01-01 15:47:29
【问题描述】:

在我的 Rails 应用程序中,我添加了以下文件:
应用程序/模型/baz.rb
lib/presenters/foo_presenter.rb
lib/presenters/foo_presenter/bar.rb
规格/模型/baz_spec.rb
spec/lib/presenters/foo_presenter/bar_spec.rb

lib/presenters/foo_presenter.rb 的内容类似于:

module Presenters
  module FooPresenter
    def self.render
      # do stuff
    end
  end
end

lib/presenters/foo_presenter/bar.rb 的内容是这样的:

module Presenters
  class FooPresenter::Bar
    def baz
      # do stuff
    end
  end
end

spec/lib/presenters/foo_presenter/bar_spec.rb 的内容是这样的:

require 'spec_helper'

module Presenters::FooPresenter
  describe Bar do
    # some tests
  end
end

然后我在 spec/models/baz_spec.rb 中有一个规范文件:

require 'spec_helper'

describe Baz do
  it 'works' do
    Presenters::FooPresenter.render
  end
end

(app/models/baz.rb 的内容与此问题无关)
问题是当我运行rspec spec/models/baz_spec.rb 时,它在没有 spork 的情况下工作正常,但是当 spork 运行时,我收到如下错误: NameError:Presenters::FooPresenter:Module 的未定义方法“render”

我对代码进行了一些跟踪,并注意到当 rspec 加载 spec/lib/presenters/foo_presenter/bar_spec.rb 时,它会导致 Rails 自动加载 lib/presenters/foo_presenter/bar.rb 等此时 Presenters::FooPresenter ::Bar 已加载,但是当 baz_spec.rb 运行时, lib/presenters/foo_presenter.rb 从未加载过,因此出现异常。但这只有在 spork 正在运行时才会发生。快速修复是在 config/initializers 中的文件中使用 require 'foo_presenter',但是是否有不需要显式要求的更清洁的解决方案?我的猜测是这里的问题是 Rails 不会自动加载 lib/presenters/foo_presenter.rb 因为 Presenters::FooPresenter 已经由 bar_spec.rb 定义。

【问题讨论】:

    标签: ruby-on-rails rspec spork


    【解决方案1】:

    我和一位同事今天遇到了这个问题,我们最终发现我们需要 Spork 在每次运行时重新加载类。我们使用 each_run() 方法来做到这一点:

    Spork.each_run do
      Dir[Rails.root.join("app/classes/**/*.rb")].each {|f| require f}
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2014-06-23
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多