[Ruby on Rails]RSpecによるRakeのテスト
はじめに
タイトル通り、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のテストを書く際の、一助になれば幸いです。