70
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Rakeタスクのテストの仕方

ここんとこ、バッチ処理周りを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 タスクをテストコードの中で複数回実行する

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
70
Help us understand the problem. What are the problem?