TDDモード開発SidekiqバックエンドのActiveJobタスクキュー

3520 ワード

この文章は二つの知識点を紹介する.
  • Rails 5.0.1でActive Jobとsidekiq
  • を設定する
  • ActiveJobのためにRspecテスト
  • を記述する

    Sidekiq設定


    Gemfileにsidekiqを追加
    gem 'sidekiq'
    

    変更config/application.rb Backend Adapterの設定
    class Application < Rails::Application
      # ...
      config.active_job.queue_adapter = :sidekiq
    end
    

    次にsidekiqプロセスのプロファイルを追加し、config/sidekiq.ymlファイルを新規作成します.
    :verbose: false
    :pidfile: ./tmp/pids/sidekiq.pid
    :logfile: ./log/sidekiq.log
    :concurrency: 1
    :queues:
      - default
    

    concurrencyの設定値はconfig/database.ymlのpoolは小さくて、詳しくはSidekiq concurrencyの設定といくつかの注意事項を見てください
    次にredis設定、config/initializers/sidekiq.rbファイルを新規作成します
    Sidekiq.configure_client do |config|
      config.redis = { url: 'redis://127.0.0.1:6379/0/cache', namespace: 'blog_server'  }
    end
    
    Sidekiq.configure_server do |config|
      config.redis = { url: 'redis://127.0.0.1:6379/0/cache', namespace: 'blog_server'  }
    end
    

    Sidekiqサービス操作

  • キューサービスRAILS_ENV=development sidekiq -C config/sidekiq.yml -d
  • を開始する.
  • キューサービス停止sidekiqctl stop tmp/pids/sidekiq.pid 0
  • Active Jobの作成


    Railsジェネレータを使用して新しいJobファイルとRspecテストファイルを生成
    shell command: rails g job email
    
    # app/jobs/email_job.rb
    class EmailJob < ApplicationJob
      queue_as :default
    
      def perform(*args)
        # Do something later
      end
    end
    

    Active Jobでsidekiqを使用する方法については、the official wiki in Sidekiqを参照してください.

    Rspecテスト


    ActiveJobテストを作成する前に、spec/rails_helper.rbで設定する必要があります.
    RSpec.configure do |config|
      config.include ActiveJob::TestHelper, type: :job
      # ...
    end
    

    各ActiveJobのテストファイルに追加する必要がないというメリットがあります.
    include ActiveJob::TestHelper
    

    また、Repscテスト環境では、ActiveJob::Base.queue_adapterをtestに設定する必要があります.the test adapter must be set to:testを参照してください.また、stackoverflowの答えHow to check what is queued in ActiveJob using Rspecでは、以下のように設定できます.これにより、各テストファイルに設定コードを追加する必要がなくなります.
    Update 1: As noticed within a comment. ActiveJob::Base.queue_adapter.enqueued_jobs works only by setting it the queue_adapter into test mode. config.active_job.queue_adapter = :test
    次に,ActiveJobのRspecテンプレートを以下のようにテストし,実際の開発過程で少し修正すれば利用できる.
    require 'rails_helper'
    
    RSpec.describe ExampleJob, type: :job do
      subject(:job) { described_class.perform_later(123) }
    
      it 'queues the job' do
        expect { job }
          .to change(ActiveJob::Base.queue_adapter.enqueued_jobs, :size).by(1)
      end
    
      it 'is in urgent queue' do
        expect(MyJob.new.queue_name).to eq('urgent')
      end
    
      it 'executes perform' do
        perform_enqueued_jobs { job }
        # expect xxxx
      end
    
      it 'handles no results error' do
        allow(MyService).to receive(:call).and_raise(NoResultsError)
    
        perform_enqueued_jobs do
          expect_any_instance_of(MyJob)
            .to receive(:retry_job).with(wait: 10.minutes, queue: :default)
    
          job
        end
      end
    
      after do
        clear_enqueued_jobs
        clear_performed_jobs
      end
    end
    

    参照リンク:
  • ActiveJob::TestHelper
  • Testing Rails ActiveJob with RSpec
  • Job spec
  • Have_enqueued_job matcher
  • Run Rails Active Job with Sidekiq and Write RSpec

  • おすすめ:
  • How to test ActionMailer + ActiveJob with Rspec