Неинициализированная константа Rspec для класса, вложенного внутри модуля — Ruby on Rails

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 не разрешается автоматически.

В принципе, у вас есть два варианта исправить это:

  1. явно требуется файл с require lib/my_namespace/my_new_class в верхней части файла спецификации
  2. добавить lib/ в пути к автозагрузке (в настоящее время это не рекомендуется)