Я плохо знаком с Ruby, и я пытался изучить Грабли, RSpec и Огурец. Я нашел некоторый код, который поможет мне протестировать свои задачи Граблей, но я испытываю затруднения, заставляя его работать. Мне сказали здесь: http://blog.codahale.com/2007/12/20/rake-vs-rspec-fight/ для отбрасывания этого:
def describe_rake_task(task_name, filename, &block)
require "rake"
describe "Rake task #{task_name}" do
attr_reader :task
before(:all) do
@rake = Rake::Application.new
Rake.application = @rake
load filename
@task = Rake::Task[task_name]
end
after(:all) do
Rake.application = nil
end
def invoke!
for action in task.instance_eval { @actions }
instance_eval(&action)
end
end
instance_eval(&block)
end
end
в мой spec_helper.rb файл.
Мне удалось вынуть этот код, и работать он в моем огурце ступает как это:
When /^I run the update_installers task$/ do
@rake = Rake::Application.new
Rake.application = @rake
load "lib/tasks/rakefile.rb"
@task = Rake::Task["update_installers"]
for action in @task.instance_eval { @actions }
instance_eval(&action)
end
instance_eval(&block)
Rake.application = nil
end
но когда я пытаюсь получить вещи, работающие в rspec, я получаю следующую ошибку.
ArgumentError в 'Задаче граблей install_grapevine должен установить на mygrapevine каталоге'
неправильное количество аргументов (1 для 2)/spec/spec_helper.rb: 21:in
instance_eval' /spec/spec_helper.rb: 21:in
блок в вызывает!'/spec/spec_helper.rb: 20:ineach' /spec/spec_helper.rb: 20:in
вызовите!'/spec/tasks/rakefile_spec.rb:12:in 'блок (2 уровня) в'
К сожалению, у меня есть чуть менее чем неделя рубина под поясом, таким образом, материал метапрограммирования находится вне моего понимания. Кто-либо мог указать на меня в правильном направлении?
Поскольку тестировать рейк для меня слишком сложно, я стараюсь решить эту проблему. Всякий раз, когда я оказываюсь перед задачей с длинными граблями, которую хочу протестировать, я создаю модуль / класс в lib /
и перемещаю туда весь код из задачи. Это оставляет задачу на одну строку кода Ruby, которая делегирует что-то более тестируемое (класс, модуль, вы называете это). Единственное, что остается непроверенным, - это то, вызывает ли задача rake правильную строку кода (и передает ли правильные параметры), но я думаю, что это нормально.
Было бы полезно сообщить нам, какая 21 строка вашего spec_helper.rb
. Но, учитывая, что опубликованный вами подход глубоко укоренился в граблях (в отношении его переменных экземпляра), я бы полностью отказался от него ради того, что я предложил в предыдущем абзаце.