ここんとこ、バッチ処理周りをRakeタスクで解決することが多くなってきた。
実のところRakeタスク自体のUnitTestは書いてなくて、Rakeタスク叩いての「いきなり結合テスト」での検証にとどまっていた。
より高い安心感を求めてUnitTestするためにRakeタスクのUnitTestに取り組んでみる。
Goal
- rspec コードから rake タスクの呼び出す
前提
- rspec
何はともあれ、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 を作成
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 タスクをテストコードの中で複数回実行する