rakeタスクをRSpecでテストする
前回の記事で実装したrakeタスクをRSpecでテストしました。
以下のQiita記事を参考にコードを書きました。
qiita.com
記事「とってもシンプルでわかりやすいでしょう?」
ぼく「わからん」
知識不足で何をしているか分からなかったので、調べた結果を残しておこうと思います。
テストの実装方法
1. rake_helper.rb 等にテスト全体に及ぼす設定を書く
require 'rails_helper' RSpec.configure do |config| config.before(:suite) do Rails.application.load_tasks end config.before(:each) do Rake.application.tasks.each(&:reenable) end end
2. rake.application 経由で呼び出したタスクを実行する
require 'rake_helper' describe 'article_state:update' do subject(:task) { Rake.application['article:create'] } it 'article_create' do expect { task.invoke }.to change { Article.count }.from(0).to(1) end end
解説
before(:suite)
: テストスイートが実行される前にブロック内が実行される
Rails.application.load_tasks
: rakeをロードして、lib/tasks配下のrakefileをロードする。この中でrequire 'rake'をやっている。
# Load Rake, railties tasks and invoke the registered hooks. # Check <tt>Rails::Railtie.rake_tasks</tt> for more info. def load_tasks(app = self) require "rake" run_tasks_blocks(app) self end
before(:each)
: 全てのテストケース(it)において、実行される前にブロック内が実行される
Rake.application.tasks
: 全てのタスクリストを返す
reenable
タスクの実行履歴を消して、もう一度タスクをinvokeで実行できる様にする。
Rake.application[' article:create ']
: 与えられたタスク名にマッチするタスクを検索する。
参考
RailsでRakeタスクをシンプルかつ効果的にテストする手法 - Qiita
GitHub - rails/rails: Ruby on Rails