Как се пише задача за изпълнение на тестове в Rails 3?

Бих искал да напиша рейк задачи, за да персонализирам тестове. Например, за да стартирам модулни тестове, създадох файл със следния код и го записах като 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 Build Language. И двете са супер.

person jmonteiro    schedule 11.09.2011
comment
Предполагам, че можете да подчертаете изречението: Няма нужда да cd. Бих казал, че може също да е малко опасно, когато не се извика с блок, защото би (ако вече не беше същото) променило текущата директория за всички други действия. И също така първото ви предложение за използване на 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