在我的Rails应用程序中,我添加了以下文件:
应用程序/模型/ baz.rb
LIB /主持人/ foo_presenter.rb
LIB /主持人/ foo_presenter / bar.rb
规格/型号/ baz_spec.rb
规格/ LIB /主持人/ 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中有一个spec文件:
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
我对代码进行了一些跟踪,并注意到当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'
,但有一个更清洁的解决方案,不需要显式要求?我的猜测是这里的问题是Rails没有自动加载lib / presenters / foo_presenter.rb,因为presenters :: FooPresenter已经由bar_spec.rb定义。
答案 0 :(得分:0)
我和同事今天遇到了这个问题,我们最终发现我们需要Spork在每次运行时重新加载这些类。我们使用each_run()方法来执行此操作:
Spork.each_run do
Dir[Rails.root.join("app/classes/**/*.rb")].each {|f| require f}
end