84
71

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rakeタスクのテストの仕方

Last updated at Posted at 2015-09-16

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

84
71
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
84
71

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?