2017-08-22 6 views
0

rspecでテストコードを作成します。私はコールバックが実行されているかどうかをテストしたい。
task main: [:callback]は、mainの前にcallbackを実行することを意味します。rakeタスクコールバックをテストする方法

しかし、私のテストは失敗しました。私は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

、私はコールバック:callbackを呼ぶだろうかわからない、それは依存のより多くのです。あなたは

task main: [:callback] 

を行う際は、あなたが本当に何を言っているのに対し、メインタスクが実行された後、それが起こる暗示コールバックは、あなたが最初に実行した他のタスクに依存していることです。ですから、私はその名前を変更することになりますが、それはおそらくこの質問の単なるサンプル名です。しかし、私は逃げ出して、私はこの答えのために書いたように仕事を:callbackと呼びます。


ここでの主な問題は、あなたがrakeタスクにexecuteを呼び出すとき、唯一そのタスクが実行されることをです。これは、依存関係のチェーン全体を呼びたくない状況が存在する可能性があるためです。我々はあなたのファイルに別のタスクを追加するとしましょう:

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

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

我々はこれを実行すると、我々は非常に可能性が高い代わりにHello, Worldの、出力Goodbye, Cruel Worldmainタスクをしたいと我々はすべての依存関係を呼び出す場合、main:callbackを呼び出してしまうでしょう@greetingをオーバーライドし、最終的にHello, Worldを出力します。

があり、しかし、全体の依存関係のチェーンを呼び出すし、別のタスク:invokeは:私たちは、このタスクを実行する場合

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

、今は代わりにGoodbye, Cruel WorldHello, World表示されます。だから、これのすべてを言ったことは、あなたのRSpecテストではどういう意味ですか? subject

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

に変更するだけで、依存関係を実行する必要があります。

関連する問題