Подтвердить что ты не робот

Задачи тестового рейка

Я разрабатываю приложение ROR, которое опирается на многие пользовательские задачи Rake.

Каков наилучший способ их протестировать?

4b9b3361

Ответ 1

Задачи Rake довольно сложно проверить. Самым простым решением было бы перевести логику в метод в соответствующей модели. Затем вы можете проверить это и просто вызвать метод из задачи рейка.

Ответ 2

Что-то вроде:

  def execute_rake(file,task)
    require 'rake'
    rake = Rake::Application.new
    Rake.application = rake
    Rake::Task.define_task(:environment)
    load "#{Rails.root}/lib/tasks/#{file}"
    rake[task].invoke
  end

В вашей спецификации:

execute_rake("tags.rake","tags:popular")

Ответ 3

Это довольно хорошо описано в другом вопросе SO

Моя рекомендация, повторенная здесь в резюме, заключается не в том, чтобы попробовать проверить задачи рейка: извлеките код для тестирования в класс, модель или функцию lib и протестируйте его там. Затем просто используйте rake для вызова функций и управления зависимостями.

Ответ 4

Мне больше нравится PivotalLabs. Тем не менее, я обобщил и изменил свой код в моем приложении:

# file: spec/tasks/my_rake_file_spec.rb
require 'spec_helper'
require 'rake'

describe 'my_rake_file.rake' do
  before :all do
    Rake.application.rake_require 'tasks/my_rake_file'
    Rake::Task.define_task(:environment)
  end

  let(:run_rake_task) {
    Rake::Task[task_name].reenable
    Rake.application.invoke_task task_name
  }

  describe 'my_task_name' do
    let(:task_name) { "my_task_name" }

    it "creates 10 cars" do
      run_rake_task
      Car.count.should == 10
    end
  end
end

Кроме того, я извлек тяжелый подъем my_rake_file.rake-кода в модуль, который хранится в lib/

Ответ 6

Rake задачи действительно должны испытывать, особенно если вы делаете некоторые пакетную обработку в нем. Тестировать их довольно легко в эти дни:

class CleanExamsTaskTest < ActiveSupport::TestCase
  def test_deletes_results_of_old_exams
    travel_to Time.zone.parse('2010-07-05 10:00')
    @exam.update!(end: Time.zone.parse('2010-07-04 09:59'))

    assert_difference -> { @exam.answered_questions.count }, -1 do
      capture_io { run_task }
    end
  end

  def test_output
    travel_to Time.zone.parse('2010-07-05 10:00')
    @exam.update!(end: Time.zone.parse('2010-07-04 09:59'))

    assert_output("Exams processed: 1\n") { run_task }
  end

  private

  def run_task
    Rake::Task['exams:clean'].execute
  end
end

Полный пример

Протестировано с Ruby> = 1.9 и Rails 5.2.