Rails自动加载在RSpec中表现奇怪,带有spork的模块和子类

时间:2013-01-18 00:01:24

标签: ruby-on-rails rspec spork

在我的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

的未定义方法`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运行时才会发生。快速解决方案是在配置/初始化程序的文件中require 'foo_presenter',但有一个更清洁的解决方案,不需要显式要求?我的猜测是这里的问题是Rails没有自动加载lib / presenters / foo_presenter.rb,因为presenters :: FooPresenter已经由bar_spec.rb定义。

1 个答案:

答案 0 :(得分:0)

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

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