У меня есть модель, которая получает свои данные из объекта парсера. Я думаю, что класс парсера должен жить в каталоге lib/(хотя меня можно убедить в том, что он должен жить в другом месте). Вопрос в следующем: где должен проходить мой модуль для класса парсера? И как я могу гарантировать, что они будут выполняться каждый раз, когда я запускаю тест рейка?
Rails: как проверить код в каталоге lib/?
Ответ 1
В приложении Rails, над которым я работаю, я решил просто разместить тесты в каталоге test\unit
. Я также создам их в каталоге module/, например:
lib/a.rb => test/unit/a_test.rb
lib/b/c.rb => test/unit/b/c_test.rb
Для меня это был путь последнего сопротивления, поскольку эти тесты выполнялись без каких-либо других изменений.
Ответ 2
Здесь один из способов:
Создайте lib/tasks/test_lib_dir.rake
со следующими
namespace :test do
desc "Test lib source"
Rake::TestTask.new(:lib) do |t|
t.libs << "test"
t.pattern = 'test/lib/**/*_test.rb'
t.verbose = true
end
end
Подмените структуру вашего lib
dir в директории test
, заменив код lib соответствующими тестами.
Запустите rake test:lib
, чтобы запустить тесты lib.
Если вы хотите, чтобы все тесты запускались при вызове rake test
, вы можете добавить следующее в свой новый файл рейка.
lib_task = Rake::Task["test:lib"]
test_task = Rake::Task[:test]
test_task.enhance { lib_task.invoke }
Ответ 3
Я хотел сделать то же самое, но с rspec и autospec, и потребовалось немного копания, чтобы выяснить, где они получают список каталогов/шаблонов файлов, которые диктовали запуск тестовых файлов. В конечном итоге я нашел это в lib/tasks/rspec.rake: 86
[:models, :controllers, :views, :helpers, :lib, :integration].each do |sub|
desc "Run the code examples in spec/#{sub}"
Spec::Rake::SpecTask.new(sub => spec_prereq) do |t|
t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
end
end
Я поместил свои тесты в новый каталог spec/libs, когда файл rpsec.rake был настроен для просмотра в spec/lib. Просто переименование libs → lib сделал трюк!
Ответ 4
Простым и понятным способом является создание каталога под тестом /unit/lib. Затем создайте тест как test/unit/lib/foo_test.rb, соответствующий lib/foo.rb. Никаких новых задач рейка не требуется, и вы можете вложить больше каталогов, если это необходимо, чтобы соответствовать структуре каталога lib.
Ответ 5
От Rails 4.0:
rake test:all # Run all tests in any subdir of `test` without resetting the DB
rake test:all:db # Same as above and resets the DB
Как Rails 4.1, переопределите test:run
, чтобы включить дополнительные задачи при запуске rake
или rake test
:
# lib/tasks/test.rake
namespace :test do
Rake::Task["run"].clear
task run: ["test:units", "test:functionals", "test:generators", "test:integration", "test:tasks"]
["tasks"].each do |name|
Rails::TestTask.new(name => "test:prepare") do |t|
t.pattern = "test/#{name}/**/*_test.rb"
end
end
end
У этого есть дополнительный бонус определения rake test:tasks
в данном примере.
От Rails 4.2, test:run
включает все поддиры test
, включая их при запуске rake test
, и, таким образом, rake
.
Ответ 6
Чтобы не определять дополнительные задачи рейка для запуска тестов из пользовательских определенных папок, вы также можете запустить их с помощью команды rake test:all
. Структура папок тестов для папки lib
или любой другой пользовательской папки зависит от вас. Но я предпочитаю дублировать их в классах: lib
соответствует test/lib
, app/form_objects
- test/form_objects
.
Ответ 7
Использование:
[spring] rake test:all
для запуска всех тестов, включая созданные вами каталоги (например, [root]/test/lib/
).
Опустить [spring]
, если tou не использует его.