ruby-on-rails #ruby #rspec
#ruby-on-rails #ruby #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
Комментарии:
1. Ну, материал из
lib
каталога долженrequire
быть общим. Можетlib/another_namespace
быть, это требовалось вapplication.rb
?2. Если вы имеете в виду
config/application.rb
, то, к сожалению, это не так. Также нет ничего об этом конкретном файле в любом файле среды (напримерconfig/environments/test.rb
)
Ответ №1:
Как и подразумевал Георгий Мельников в своем комментарии, по умолчанию /lib
каталог не находится в путях автоматической загрузки, поэтому константа MyNamespace
не разрешается автоматически.
В принципе, у вас есть два варианта исправить это:
- явно требуется файл с
require lib/my_namespace/my_new_class
в верхней части файла спецификации - добавить
lib/
в пути к автозагрузке (в настоящее время это не рекомендуется)