Rails: Как проверить код в каталоге lib /? - PullRequest
47 голосов
/ 28 апреля 2009

У меня есть модель, которая получает данные из объекта синтаксического анализатора. Я думаю, что класс синтаксического анализатора должен жить в каталоге lib / (хотя я мог бы быть убежден, что он должен жить так же, как нигде). Вопрос в следующем: где должны быть мои модульные тесты для класса анализатора? И как мне убедиться, что они запускаются каждый раз, когда я запускаю тест рейка?

Ответы [ 7 ]

26 голосов
/ 29 апреля 2009

В приложении Rails, над которым я работаю, я решил просто поместить тесты в каталог test\unit. Я также вложу их в модуль / каталог, например:

lib/a.rb   => test/unit/a_test.rb
lib/b/c.rb => test/unit/b/c_test.rb

Для меня это был путь последнего сопротивления, так как эти тесты проходили без каких-либо других изменений.

22 голосов
/ 19 октября 2009

Вот один из способов:

Создать 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 каталога под test dir, заменяя код lib соответствующими тестами.

Запустите rake test:lib, чтобы запустить свои тесты lib.

Если вы хотите, чтобы все тесты выполнялись при вызове rake test, вы можете добавить следующее в ваш новый файл rake.

lib_task = Rake::Task["test:lib"]
test_task = Rake::Task[:test]
test_task.enhance { lib_task.invoke }
8 голосов
/ 01 июля 2010

Я хотел сделать то же самое, но с помощью 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 сделал свое дело!

3 голосов
/ 20 декабря 2014

По состоянию на Рельсы 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.

3 голосов
/ 10 февраля 2014

Простой и понятный способ - просто создать каталог под test / unit / lib. Затем создайте тест как test / unit / lib / foo_test.rb, соответствующий lib / foo.rb. Новые грабли не требуются, и вы можете вложить больше каталогов, если это необходимо для соответствия структуре каталогов lib.

0 голосов
/ 03 октября 2014

Использование:

[spring] rake test:all

для запуска всех тестов, включая созданные вами каталоги (например, [root]/test/lib/).

Пропустить [spring], если вы не используете его.

0 голосов
/ 30 января 2014

Чтобы не определять дополнительные задачи rake для запуска тестов из пользовательских папок, вы также можете запускать их с помощью команды rake test:all. Проверяет структуру папок для папки lib или любой другой пользовательской папки. Но я предпочитаю дублировать их в классах: lib соответствует test/lib, app/form_objects - test/form_objects.

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