测试佣金任务

时间:2009-08-10 14:23:19

标签: ruby testing rake

我正在开发一个依赖于许多自定义Rake任务的ROR应用程序。

测试它们的最佳方法是什么?

6 个答案:

答案 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)

another SO question

详细介绍了这一点

我的建议在这里重复总结,不是尝试测试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

Full example

使用Ruby> = 1.9和Rails 5.2进行测试。使用Minitest中的stdlib。没有其他依赖项。