我使用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
答案 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 }
因为您想要运行依赖项。