Help us understand the problem. What is going on with this article?

Rakeタスクのテストの仕方

More than 3 years have passed since last update.

ここんとこ、バッチ処理周りをRakeタスクで解決することが多くなってきた。

実のところRakeタスク自体のUnitTestは書いてなくて、Rakeタスク叩いての「いきなり結合テスト」での検証にとどまっていた。

より高い安心感を求めてUnitTestするためにRakeタスクのUnitTestに取り組んでみる。

Goal

  • rspec コードから rake タスクの呼び出す

前提

  • rspec

何はともあれ、Rakeタスクの準備

lib/tasks/csv.rake
namespace :csv
  desc 'CSVのexport'
  task export: :environment do |t|
    puts t.name
  end

  desc 'CSVのimport'
  task import: :environment do |t|
    puts t.name
  end
end

○実行確認

$ bundle exec rake csv:import
(in /Users/kawakubox/workspace/rails-labo)
csv:import

$ bundle exec rake csv:export
(in /Users/kawakubox/workspace/rails-labo)
csv:export

specコードの作成

modelやcontrollerに倣って、spec/lib/tasks/csv_spec.rb を作成

spec/lib/tasks/csv_spec.rb
require 'rails_helper'
require 'rake'

describe 'rake task csv' do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake
    Rake.application.rake_require 'tasks/csv' # Point 1
    Rake::Task.define_task(:environment)
  end

  before(:each) do
    @rake[task].reenable  # Point 2
  end

  describe 'csv:import' do
    let(:task) { 'csv:import' }
    it 'is succeed.' do
      expect(@rake[task].invoke).to be_truthy
    end
  end
end

○テスト実行

$ bundle exec rspec
csv:import
.

Finished in 0.00301 seconds (files took 3.27 seconds to load)
1 example, 0 failures

Point 1

Rake.application.rake_require 'tasks/csv' でloadする.rakeファイルを指定するが、参考にしたサンプル通りに記述したら、csv.rakeがロードできないと怒られた。


  1) rake task csv csv:import 
     Failure/Error: Rake.application.rake_require 'csv'
     LoadError:
       Can't find csv
     # ./spec/lib/tasks/csv_spec.rb:8:in `block (2 levels) in <top (required)>'

Rake.application.rake_require 'tasks/csv'直前にbinding.pryを差し込んで $LOAD_PATH を確認したところ、lib/ まで通っていたので、tasks/csv としたら無事ロードされた。

config/application.rb の設定次第で適宜変えればよいかな。

Point 2

@rake[task].reenable spec内で同一タスクを2回以上実行しないのであれば不要。

参考

[Ruby on Rails]RSpecによるRakeのテスト | Developers.IO
Rake タスクをテストコードの中で複数回実行する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away