如何测试rake任务回调

时间:2017-08-22 22:37:05

标签: ruby rspec

我使用rspec创建测试代码。我想测试回调是否执行。
task main: [:callback]表示在callback之前运行main,不是吗?

但我的测试失败了。我看起来callback没有被执行。为什么呢?

require 'rails_helper'
require 'rake'

RSpec.describe 'Rake::Task' do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake
    Rake.application.rake_require('rspec_before', ["#{Rails.root}/lib/tasks"])
  end

  subject { @rake['rspec_before:main'].execute }

  it "expects run callback before main task" do
    expect{ subject }.to output(/Hello, world/).to_stdout
  end
end

我的佣金任务如下。

namespace :rspec_before do
  task :callback do
    @greeting = "Hello, world"
  end

  # case 1
  # In this case, `callback` is NOT executed in rspec
  # In console, `callback` is executed !!!!
  desc "main task"
  task main: [:callback] do
    puts @greeting
  end

  # case 2
  # In this case, `callback` is executed in rspec
  # task :main do
  #   Rake::Task['rspec_before:callback'].execute
  #   puts @greeting
  # end
end

1 个答案:

答案 0 :(得分:0)

所以,我不确定我会将:callback称为回调,它更像是一个依赖回调意味着它在主要任务完成后发生,而当你执行

task main: [:callback]

你真正说的是你依赖于先跑的其他任务。所以我最终会更改它的名称,尽管这可能只是这个问题的样本/一次性名称。但是,我离题了,我会继续按照这个答案所写的那样调用任务:callback

这里的主要问题是,当您在rake任务上调用execute时,只会执行该任务。这是因为可能存在您不希望或不需要调用整个依赖关系链的情况。假设我们在您的文件中添加了另一项任务:

desc "secondary task"
task :secondary do
  @greeting = 'Goodbye, Cruel World'

  Rake::Task['rspec_before:main'].execute
end

如果我们运行此操作,我们很可能希望main任务输出Goodbye, Cruel World而不是Hello, World,如果我们调用所有依赖项,main最终会调用:callback会覆盖我们的@greeting并最终输出Hello, World

然而,还有另一个任务调用整个依赖链:invoke

desc "secondary task"
task :secondary do
  @greeting = 'Goodbye, Cruel World'
  Rake::Task['rspec_before:main'].invoke
end

如果我们运行此任务,现在我们会看到Hello, World而不是Goodbye, Cruel World。所以,说完所有这些,这对你的RSpec测试意味着什么?您只需将subject更改为:

即可
subject { @rake['rspec_before:main'].invoke }

因为您想要运行依赖项。