0

在我的 Rails 应用程序中,我添加了以下文件:
app/models/baz.rb
lib/presenters/foo_presenter.rb
lib/presenters/foo_presenter/bar.rb
spec/models/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: undefined method `render' for演示者::FooPresenter:模块

我对代码进行了一些跟踪,并注意到当 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 正在运行时才会发生。快速修复是require 'foo_presenter'在 config/initializers 中的文件中,但是是否有不需要显式要求的更清洁的解决方案?我的猜测是这里的问题是 Rails 不会自动加载 lib/presenters/foo_presenter.rb 因为 Presenters::FooPresenter 已经由 bar_spec.rb 定义。

4

1 回答 1

0

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

Spork.each_run do
  Dir[Rails.root.join("app/classes/**/*.rb")].each {|f| require f}
end
于 2013-05-10T20:02:53.807 回答