Ruby
Rails
rake

Rakeタスクのテストの仕方

More than 1 year has 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 タスクをテストコードの中で複数回実行する