Rails 4:模块上未定义的方法

时间:2014-02-12 13:17:24

标签: ruby rspec ruby-on-rails-4 dsl

我在app/misc/dsl/builder.rb中有一个包含此代码的模块

module Dsl
  class Builder
    def initialize(context, &block)
      return if not block_given?

      parent_context = block.binding.eval "self"
      parent_context.extend Proxy
      parent_context.object = context 

      parent_context.instance_eval &block
    end
  end

  def self.set_context(context, &block)
    Dsl::Builder.new(context, &block)
  end
end

注意:此目录misc已预先加载到application.rb

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/}'), 
  Rails.root.join('app', 'misc', '{**/}')
]

然后,在文本的某个地方(比如foo.rb)我有这个代码:

Dsl.set_context(obj) do
  #some code with obj receiving messages
end

我们使用的测试堆栈包含Zeus + Guard + Rspec。现在,假设我将代码重写为无效的代码

Dsl.set_context(obj) do
  asdqwe #this message does not exists
end

有时候,我收到这个令人费解的消息

  1) SomeOtherClass search_hash receiving keywords params should query for those keywords
     Failure/Error: subject.search_hash
     NoMethodError:
       undefined method `set_context' for Dsl:Module
     # ./app/misc/product_query.rb:116:in `base_search_hash'
     # ./app/misc/product_query.rb:25:in `search_hash'
     # ./spec/misc/product_query_spec.rb:78:in `block (4 levels) in <top (required)>'
     # -e:1:in `<main>'

而不是关于undefined method asdqwe

的正确消息

关于此的任何线索?

1 个答案:

答案 0 :(得分:1)

here

它说:

  

Rails 3已经更新,以便类/模块(以下称为C / M)   是否需要从自动加载路径加载延迟

所以,你可以在你的rspec_helper.rb中做require_relative 'app/misc/dsl/builder.rb'(只用require会更好吗?)问题必须是加载器事先不知道在哪里找Dsl.set_context 1}},但是一旦引用了Dsl::Builder

,他就会知道

希望有所帮助