Как написать задачу для запуска тестов в Rails 3?

Я хотел бы написать rake tasks для настройки тестов. Например, для запуска модульных тестов я создал файл со следующим кодом и сохранил его как lib/tasks/test.rake:

task :do_unit_tests do
  cd #{Rails.root} 
  rake test:units
end

Запуск rake do_unit_tests выдает ошибку: can't convert Hash into String.

Работа в Rails 3.0.7 и использование встроенной среды модульного тестирования.

Спасибо.


person B Seven    schedule 11.09.2011    source источник


Ответы (2)


Нет необходимости cd. Вы можете просто...

task :do_unit_tests do
  Rake::Task['test:units'].invoke
end

Но если вы действительно хотите cd, вот как вы называете инструкции оболочки:

task :do_unit_tests do
  sh "cd #{Rails.root}"
  Rake::Task['test:units'].invoke
end

Ну на самом деле есть укороченная версия. Инструкция cd имеет специальный псевдоним, как Chris, упомянутый в другом ответе, поэтому вы можете просто...

task :do_unit_tests do
  cd Rails.root
  Rake::Task['test:units'].invoke
end

Если вы хотите пойти дальше, я рекомендую Руководство по рейку Джейсона Сейфера и Статьи Мартина Фаулера "Использование языка сборки Rake". Оба великолепны.

person jmonteiro    schedule 11.09.2011
comment
Я полагаю, вы можете выделить предложение: Нет необходимости в компакт-диске. Я бы сказал, что это также может быть немного опасно, когда не вызывается с блоком, потому что это (если это уже не то же самое) изменит текущий каталог для всех других действий. А также ваше первое предложение использовать sh "cd ..." не сработает, потому что путь будет изменен только в новом процессе оболочки, который завершается, как только каталог меняется. - person Arsen7; 12.09.2011

Вы пытаетесь интерполировать значение, которое не находится в строке, и вы также обрабатываете rake test:units как вызов метода с аргументами, что не так.

Измените строку cd, чтобы вы вызывали метод со значением Rails.root, и измените вторую строку на инструкцию оболочки.

task :do_unit_tests do
  cd Rails.root
  `rake test:units`
end
person Chris    schedule 11.09.2011
comment
Выдает ошибку: undefined local variable or method 'units' for main:Object. - person B Seven; 11.09.2011
comment
Я только прочитал и исправил первую строку. Теперь я обновил вторую строку, сделав ее системной командой, поэтому в коде нет ошибок. Тем не менее, есть более подходящие способы сделать это, как описано jmonteiro. - person Chris; 11.09.2011
comment
Это также вызвало ошибку. Добавление --trace открывает rake aborted!Command failed with status (1): [/home/baller/.rvm/rubies/ruby-1.9.2-p180/b...] /home/baller/.rvm/gems/ruby-1.9.2-p180/gems/rake-0.8.7/lib/rake.rb:995:in 'block in sh' - person B Seven; 11.09.2011