LoginSignup
3
3

More than 1 year has passed since last update.

【Rails】Active Jobのテストの書き方

Last updated at Posted at 2022-02-28

初めに

Active job のテストは E2E テストで行えますが、job 単体のテストをしたい時に書き方がわからなかったのでここに残しておきます。

やりたい事

job 単体のテストを書く

環境

Ruby 2.7.4

Rails 6.1.3

Rspec 3.10.1

Job テスト

まずは、spec ディレクトリの下に jobs ディレクトリを作成します。
そして、テストしたい job のスペックを作成します。

コンソール

/rails # mkdrir spec/jobs

/rails # touch spec/jobs/<job名>_job__spec.rb

job がキューに入ったことの確認するテストと job が実行されているかのテストを書きます。
DeleteReviewJob は review を削除する job です

rails/app/jobs/delete_review_job.rb
class DeleteReviewJob < ApplicationJob
  queue_as :default

  def perform(review)
    review.destroy
  end
end

rails/spec/jobs/job名_job_spec.rb
require 'rails_helper'

RSpec.describe 'jobs', type: :job do
  let(:user) { create(:user) }
  let(:product) { create(:product, user: user) }
  let(:review) { create(:review, user: user, product: product) }

  describe 'perform_later' do
    it 'enqueue job' do
      ActiveJob::Base.queue_adapter = :test #jobを起動するアダプターtest環境ではtestにしておく
      DeleteReviewJob.perform_later(review)
      expect(DeleteReviewJob).to have_been_enqueued #キューに入ったかを確認する
    end

    it 'delete review' do
      ActiveJob::Base.queue_adapter = :test
      review
      expect do
        DeleteReviewJob.perform_now(review)
      end.to change(Review, :count).by(-1) #jobが発動して、reviewが削除されたかを確認している
    end
  end
end

参考

Relish

RSpec でキューイングした ActiveJob を同期実行する

blog.kotamiyake.me

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3