在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
不会自动解析。
你基本上有两个选项来解决这个问题:
- 明确要求在规范文件 的顶部有
- 将
lib/
添加到自动加载路径(现在不鼓励这样做)
require lib/my_namespace/my_new_class
的文件