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

github.com

before(:each) : 全てのテストケース(it)において、実行される前にブロック内が実行される
Rake.application.tasks : 全てのタスクリストを返す
reenable タスクの実行履歴を消して、もう一度タスクをinvokeで実行できる様にする。

Rake.application[' article:create '] : 与えられたタスク名にマッチするタスクを検索する。

参考

RailsでRakeタスクをシンプルかつ効果的にテストする手法 - Qiita

GitHub - rails/rails: Ruby on Rails

library rake (Ruby 3.0.0 リファレンスマニュアル)

class Rake::Task (Ruby 3.0.0 リファレンスマニュアル)