TDDモード開発SidekiqバックエンドのActiveJobタスクキュー
3520 ワード
この文章は二つの知識点を紹介する. Rails 5.0.1でActive Jobとsidekiq を設定する ActiveJobのためにRspecテスト を記述する
Gemfileにsidekiqを追加
変更
次にsidekiqプロセスのプロファイルを追加し、
concurrencyの設定値はconfig/database.ymlのpoolは小さくて、詳しくはSidekiq concurrencyの設定といくつかの注意事項を見てください
次にredis設定、
キューサービス を開始する.キューサービス停止
Railsジェネレータを使用して新しいJobファイルとRspecテストファイルを生成
Active Jobでsidekiqを使用する方法については、the official wiki in Sidekiqを参照してください.
ActiveJobテストを作成する前に、
各ActiveJobのテストファイルに追加する必要がないというメリットがあります.
また、Repscテスト環境では、
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テンプレートを以下のようにテストし,実際の開発過程で少し修正すれば利用できる.
参照リンク: 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
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
参照リンク:
おすすめ: