👌

Rails上に定義したRakeタスクをテストする

2023/11/01に公開

概要

Rails上に定義したRakeタスクをテストする方法を記載します。

やってみる

lib/tasks/books.rake
# frozen_string_literal: true

namespace :books do
  task :read, ['name'] => :environment do |_task, args|
    pp "I read #{args[:name]}."
  end
end
spec/lib/books_spec.rb
# frozen_string_literal: true

require 'rails_helper'

describe 'books:read' do
  let(:task) { Rake.application['books:read'] }

  before(:all) do
    Rails.application.load_tasks
  end

  before(:each) do
    # 2回目のタスク実行を可能にする
    Rake.application.tasks.each(&:reenable)
  end

  it do
    expect { task.invoke('koukyou') }.to output("\"I read koukyou.\"\n").to_stdout
  end

  it do
    expect { task.invoke('rongo') }.to output("\"I read rongo.\"\n").to_stdout
  end
end

Discussion