ruby - RSpec 为/lib 的子目录中的代码引发 NameErrors

标签 ruby rspec rspec3 ruby-2.2

我有一个具有以下结构的 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.rbqux_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/

相关文章:

ruby - 检查集合以包含满足 lambda 的项的 RSpec 匹配器

ruby-on-rails - 在在线应用程序中表示 Excel 电子表格

ruby-on-rails - rspec 模拟 ActionMailer

ruby - `require' : cannot load such file -- spec_helper (LoadError)

ruby-on-rails - RSpec 3.5 将参数传递给 shared_context

ruby - 在RSpec中,stub!有什么区别? stub ?

ruby - 如何从 StringScanner 捕获项目?

ruby - 使用 Nokogiri 时,如何抑制自关闭标签的插入?

ruby-on-rails - Express Checkout 订单总计丢失

ruby-on-rails - Rspec 模型方法在由 let 创建时返回 nil