Я разрабатываю приложение ROR, которое опирается на многие пользовательские задачи Rake.
Каков наилучший способ их протестировать?
Я разрабатываю приложение ROR, которое опирается на многие пользовательские задачи Rake.
Каков наилучший способ их протестировать?
Задачи Rake довольно сложно проверить. Самым простым решением было бы перевести логику в метод в соответствующей модели. Затем вы можете проверить это и просто вызвать метод из задачи рейка.
Что-то вроде:
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")
Это довольно хорошо описано в другом вопросе SO
Моя рекомендация, повторенная здесь в резюме, заключается не в том, чтобы попробовать проверить задачи рейка: извлеките код для тестирования в класс, модель или функцию lib и протестируйте его там. Затем просто используйте rake для вызова функций и управления зависимостями.
Мне больше нравится 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/
Хорошо, теперь для этого есть драгоценный камень:
Fantaskspec - https://github.com/crismali/fantaskspec
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.