【发布时间】: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