在我的 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 定义。