Тестирование задачи граблей в rspec (и огурец)

Я плохо знаком с 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:in each' /spec/spec_helper.rb: 20:inвызовите!'/spec/tasks/rakefile_spec.rb:12:in 'блок (2 уровня) в'

К сожалению, у меня есть чуть менее чем неделя рубина под поясом, таким образом, материал метапрограммирования находится вне моего понимания. Кто-либо мог указать на меня в правильном направлении?

14
задан Amokrane Chentir 29 May 2011 в 21:52
поделиться

1 ответ

Поскольку тестировать рейк для меня слишком сложно, я стараюсь решить эту проблему. Всякий раз, когда я оказываюсь перед задачей с длинными граблями, которую хочу протестировать, я создаю модуль / класс в lib / и перемещаю туда весь код из задачи. Это оставляет задачу на одну строку кода Ruby, которая делегирует что-то более тестируемое (класс, модуль, вы называете это). Единственное, что остается непроверенным, - это то, вызывает ли задача rake правильную строку кода (и передает ли правильные параметры), но я думаю, что это нормально.

Было бы полезно сообщить нам, какая 21 строка вашего spec_helper.rb . Но, учитывая, что опубликованный вами подход глубоко укоренился в граблях (в отношении его переменных экземпляра), я бы полностью отказался от него ради того, что я предложил в предыдущем абзаце.

16
ответ дан 1 December 2019 в 06:43
поделиться