Rspec中嵌套在模块中的类的未初始化常量



在Rails项目中,我在lib目录中创建了一个新类,该类的命名空间位于模块内。当为它创建一个规范文件时,我看到的是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目录不在自动加载路径中,因此常量MyNamespace不会自动解析。

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

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