我正在开发一个依赖于许多自定义Rake任务的ROR应用程序。
测试它们的最佳方法是什么?
答案 0 :(得分:17)
类似的东西:
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")
答案 1 :(得分:16)
Rake任务很难测试。最简单的解决方案是将逻辑移动到适当模型中的方法中。然后,您可以测试它,只需从rake任务中调用该方法。
答案 2 :(得分:4)
我的建议在这里重复总结,不是尝试测试rake任务:将要测试的代码提取到类,模型或lib函数并在那里进行测试。然后只需使用rake来调用函数并管理依赖项。
答案 3 :(得分:1)
我最喜欢PivotalLabs' way。但是,我在我的应用程序中概括并修改了他们的代码:
# 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 /
中答案 4 :(得分:0)
嗯,现在有一个宝石:
Fantaskspec - https://github.com/crismali/fantaskspec
答案 5 :(得分:0)
耙任务要做需要测试,尤其是在其中执行一些批处理时。这些天来测试它们非常容易:
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进行测试。使用Minitest
中的stdlib
。没有其他依赖项。