ruby - How to test rake task callbacks -
i create test code rspec. want test callback executed or not.
task main: [:callback] means run callback before main, doesn't it?
but test failed. looks callback not executed. why?
require 'rails_helper' require 'rake' rspec.describe 'rake::task' before(:all) @rake = rake::application.new rake.application = @rake rake.application.rake_require('rspec_before', ["#{rails.root}/lib/tasks"]) end subject { @rake['rspec_before:main'].execute } "expects run callback before main task" expect{ subject }.to output(/hello, world/).to_stdout end end my rake task below.
namespace :rspec_before task :callback @greeting = "hello, world" end # case 1 # in case, `callback` not executed in rspec # in console, `callback` executed !!!! desc "main task" task main: [:callback] puts @greeting end # case 2 # in case, `callback` executed in rspec # task :main # rake::task['rspec_before:callback'].execute # puts @greeting # end end
so, i'm not sure call :callback callback, it's more of dependency. callback implies happens after main task done, whereas when do
task main: [:callback] what you're saying depend on other task having run first. end changing name of that, though that's sample/throwaway name question. but, digress , i'll continue calling task :callback written answer.
the main issue here when call execute on rake task, task gets executed. because there may situations don't want or need call entire dependency chain. let's add task file:
desc "secondary task" task :secondary @greeting = 'goodbye, cruel world' rake::task['rspec_before:main'].execute end if run this, want main task output goodbye, cruel world, instead of hello, world , if call dependencies, main end calling :callback override our @greeting , end outputting hello, world.
there is, however, task call entire dependency chain: invoke:
desc "secondary task" task :secondary @greeting = 'goodbye, cruel world' rake::task['rspec_before:main'].invoke end if run task, we'll see hello, world instead of goodbye, cruel world. so, having said of this, mean rspec test? need change subject to:
subject { @rake['rspec_before:main'].invoke } because wanting run dependencies.
wiki
Comments
Post a Comment