この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
タイトル通り、RSpecにてRakeのテストを書く方法についてです。RSpecからRakeを呼び出す方法は、普通のModelやControllerのメソッドを呼び出すのとは異なっていたので、備忘録として残しておきます。
対象となるRakeとRSpec
1.Rake
テスト対象となるRakeは以下の通りです。2つのtaskがあり、片方は引数なし、もう片方は引数を受け取ります。それぞれのtaskでは、別メソッドを呼び出しているだけの簡単な処理です。
/lib/tasks/start.rake
namespace :start do
task :exec_no_args :environment do
SampleController.exec_no_args
end
task :exec_with_args, :arg_hoge
task :exec_with_args => :environment do |t, args|
SampleController.exec_with_args args[:arg_hoge]
end
end
2.RSpec
では、RSpecです。上記のRakeを呼び出し、メソッドを正しい形式で呼び出しているかをテストします。
/spec/lib/tasks/start_spec.rb
require 'rails_helper'
require 'rake'
describe 'Startup' do
before(:all) do
@rake = Rake::Application.new
Rake.application = @rake
Rake.application.rake_require 'start'
Rake::Task.define_task(:environment)
end
before(:each) do
@rake[task].reenable
end
describe 'exec_no_args' do
let(:task) { 'start.exec_no_args' }
it 'should success.' do
expect(SampleController).to receive(:exec_no_args)
@rake[task].invoke
end
end
describe 'exec_with_args' do
let(:task) { 'start.exec_with_args' }
let(:arg_str) { 'hoge' }
it 'target date' do
expect(SampleController).to receive(:exec_with_args).with(arg_str)
@rake[task].invoke(arg_str)
end
end
end
「before(:all)〜」の中で、実行するRakeのインスタンスを作成しています。注意しなければならないのは、「rake_require」で実行するRakeの名称を指定しているのと、「Rake::Task.define_task(:environment)」で実行環境を渡している事です。
「before(:each)〜」では、テストの実行前にRakeの「reenable」を呼び出しています。これを行わないと、複数のRakeを呼び出すとエラーになります。
「describe 'exec_no_args' do〜」「describe 'exec_with_args' do〜」では、それぞれRakeを呼び出してテストを実行しています。「invole」メソッドにてRakeを呼び出し、引数があるRakeには引数を渡しています(32行目)。
まとめ
「invoke」を使ってRakeを呼び出すことができれば、後はModel等のメソッドと同様に、「expect〜」を使ってテストを書く事ができます。Rakeのテストを書く際の、一助になれば幸いです。