Rspec class 的未初始化常量嵌套在模块内 - Ruby on Rails

Rspec uninitialized constant for class nested inside module - Ruby on Rails

在一个 Rails 项目中,我在 lib 目录中创建了一个新的 class,这个 class 在一个模块中命名空间。在为其创建规范文件时,我看到 NameError: uninitialized constant MyNamespace.

这是我的文件夹结构

app/
...
lib
  my_namespace
    my_new_class.rb
  another_namespace
    another_old_class.rb
spec
  lib
    my_namespace
      my_new_class_spec.rb
    another_namespace
      another_old_class_spec.rb

这里是(缩写的)内容: lib/my_namespace/my_new_class.rb

module MyNamespace
  class MyNewClass
  end
end

spec/lib/my_namespace/my_new_class_spec.rb

RSpec.describe MyNamespace::MyNewClass do
  it "is true"
    expect(true).to eq(true) # irrelevant at this point
  end
end

我包含 another_old_class_spec.rb 的原因是它的测试 运行 没有问题,而且我找不到在测试设置中明确加载或需要的任何地方(以防这可能是一个潜在的问题)。

当 运行使用 bundle exec rspec spec/lib/my_namespace/my_new_class_spec.rb 甚至 bundle exec rspec spec/lib/my_namespace/ 进行测试时,我得到

An error occurred while loading ./spec/lib/my_namespace/my_new_class_spec.rb
Failure/Error:
RSpec.describe MyNamespace::MyNewClass do

NameError:
  uninitialized constant MyNamespace

就像 Georgiy Melnikov 在他的评论中暗示的那样,默认情况下 /lib 目录不在 autoload paths 中,因此常量 MyNamespace 不会自动解析。

你基本上有两种选择来解决这个问题:

  1. 明确要求规范文件顶部带有 require lib/my_namespace/my_new_class 的文件
  2. lib/ 添加到自动加载路径(现在不鼓励这样做)