我有一个具有以下结构的 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::酒吧::巴兹
。在 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
的规范,并且工作正常。 qux_spec.rb
,但是,它有 Foo::Bar::Qux
的规范,失败了:
/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 新手我没有发现。有什么想法吗?
最佳答案
您需要在 ./lib
下添加 foo.rb
文件,并为每个文件添加 require 语句,以便加载它们。您可以查看示例 gem 以供引用:dogeify以及一篇引导您完成 gem 创建的文章 build your first gem .
关于ruby - RSpec 为/lib 的子目录中的代码引发 NameErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29106101/