написание тестов для модулей в папке lib - PullRequest
4 голосов
/ 14 декабря 2011

Я хочу написать модульные тесты для файла модуля, который я создал, и поместить его в каталог lib. В каталоге test / unit я создал файл mylib_test.rb. В файле я потребовал mylib. Когда я запускаю rake test:units, это выдает ошибку const_missing: uninitialized constant mylib::constantname. Я думаю, что это потому, что он не загружает среду rails, поскольку константа определена в одном из файлов инициализаторов. Я прав? Как мне заставить его работать? Как лучше написать модульные тесты для модулей?

Я использую рельсы 3.1.3, и модель отлично работает, когда я запускаю приложение как из терминала, так и из браузера.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Я наконец понял, что случилось. В мои тестовые файлы я включал свои модули из каталога lib, вместо того, чтобы снова открыть модуль и поместить тестовые файлы в модуль. После этого теста граблей: агрегаты работают отлично. Тестовые файлы должны оставаться в каталоге test/unit

0 голосов
/ 29 декабря 2011

Я тоже столкнулся с этим.Есть (как минимум?) 2 возможных проблемы:

  • Ваш модуль не находится в пути автозагрузки

Ищите в config/application.rbстрока:

config.autoload_paths += %W(#{config.root}/extras)

Если это закомментировано, раскомментируйте его.Эта строка включит автозагрузку для всех файлов внутри extras, а также для всех файлов в подкаталогах extras.Возможно, наиболее безопасно переместить ваши модули в extras, но если вы действительно хотите оставить их в lib, измените строку на:

config.autoload_paths += %W(#{config.root}/extras #{config.root}/lib)
  • Ваш модуль находится впуть автозагрузки, но не названный так, как Rails ожидает

(см .: Rails 2.3.5: Как получить доступ к коду внутри lib / directory / file.rb?)

По соглашению Rails хочет, чтобы имя вашего модуля соответствовало иерархии каталогов и имени файла.Таким образом, файл extras/mylib.rb должен содержать

module Mylib   # not MyLib or My_lib
  ...
end

Это также работает для подкаталогов, поэтому файл extras/mydir/mylib.rb должен содержать:

module Mydir
  module Mylib  # or class Mylib
    ...
  end
end

Это соглашение о присвоении именТо же самое, что Rails ожидает от контроллеров и моделей.Подчеркивание в имени файла превращается в название класса / модуля верблюжьего слуха.Ожидается, что файл с именем my_lib.rb будет содержать module MyLib (но не Mylib).

ПРИМЕЧАНИЕ , что автозагрузка не означает, чтомодуль автоматически загружается при запуске;скорее, он автоматически загружается при первом использовании.Поэтому, даже если у вас есть какой-то код, например puts "hi from mylib" в верхней части файла mylib.rb, вы не увидите этот отпечаток, пока ваш код не использует где-то Mylib.

Наконец, если вы действительно хотитемодули для загрузки при запуске , создайте файл с именем config/initializers/force_load_libraries.rb и поместите его туда:

Dir.glob("#{Rails.root}/extras/force_load/*.rb").each { |f| require f }

Теперь перейдите и поместите свои библиотеки в extras/force_load, и они должны загружаться, когда Railsзапускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...