[Ruby on Rails]RSpecによるRakeのテスト

2014.09.19

この記事は公開されてから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のテストを書く際の、一助になれば幸いです。

参考サイト

Testing Rake Tasks with RSpec