测试Rake任务(Test Rake Tasks)

2019-07-31 20:15发布

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

什么是检验他们的最好方法是什么?

Answer 1:

Rake任务是相当困难的考验。 最简单的解决方案将是逻辑移入的方法在适当的模型。 然后,您可以测试并调用从rake任务的方法。



Answer 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")


Answer 3:

这是很好覆盖在另一个SO问题

我的建议,总之这里重复,不尝试测试耙任务:提取到被测试类,模型或LIB函数的代码和测试它。 然后,只需用耙调用的功能和管理依赖性。



Answer 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 /



Answer 5:

好了,现在还有了一个宝石:

Fantaskspec - https://github.com/crismali/fantaskspec



Answer 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和5.2的Rails。 使用Miniteststdlib 。 没有其他的依赖关系。



文章来源: Test Rake Tasks