【发布时间】:2015-05-20 07:05:23
【问题描述】:
我有一个结构如下的 gem 项目:
foo-bar
├── lib
│ └── foo
│ ├── bar
│ │ └── qux.rb
│ └── bar.rb
└── spec
├── spec_helper.rb
└── unit
├── baz_spec.rb
└── qux_spec.rb
在lib/foo 中,bar.rb 定义了一个模块Foo::Bar,在其中定义了一个类Foo::Bar::Baz。在lib/foo/bar、qux.rb 内部定义了一个类Foo::Bar::Qux。
spec_helper.rb 设置 RSpec 和 Simplecov,并以require 'foo/bar' 结束。 baz_spec.rb 和 qux_spec.rb 都以 require 'spec_helper' 开头。
baz_spec.rb 具有Foo::Bar::Baz 的规格,并且工作正常。但是,具有 Foo::Bar::Qux 规范的 qux_spec.rb 失败并显示:
/Users/me/foo-bar/spec/unit/qux_spec.rb:6:in `<module:Bar>': uninitialized constant Foo::Bar::Qux (NameError)
from /Users/me/foo-bar/spec/unit/qux_spec.rb:4:in `<module:Foo>'
from /Users/me/foo-bar/spec/unit/qux_spec.rb:3:in `<top (required)>'
from /Users/me/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.2/lib/rspec/core/configuration.rb:1226:in `load'
...
(etc.)
我通过将Foo::Bar::Baz 的代码从lib/foo/bar.rb 移出到它自己的文件lib/foo/bar/baz.rb 中验证了这不仅仅是一个错字,之后baz_spec.rb 也停止工作。
我是否将类声明为似乎也没有什么区别
class Foo::Bar::Qux
...
或作为
module Foo
module Bar
class Qux
...
我在 Mac OS X Yosemite 上使用 Ruby 2.2.0 和 RSpec 3.2.2。
很明显,我的requires 有问题,但作为一个 Ruby 新手,我没有看到它。有什么想法吗?
【问题讨论】:
-
可能的解决方案取决于您使用的框架类型。那么,您使用的是 Rails 还是 ActiveSupport?
-
两者都不是。好吧,我想 ActiveSupport 在那里,因为我的 gemspec 中有 ActiveJob,但它还没有被使用。
标签: ruby rspec rspec3 ruby-2.2