如何使用 RSpec 测试 Sidekiq worker?

How to test a Sidekiq worker with RSpec?

我正在使用 RSPEC 进行测试,并使用 Sidekiq 进行后台作业。

因为 rspec 中没有 workers 的生成器,不确定要使用什么。

https://relishapp.com/rspec/rspec-rails/docs/generators

require 'spec_helper'

RSpec.describe TestWorker, type: ? do # ex. :worker :sidekiq ...
  describe "TestWorker" do
    it "" do
     ....
    end
  end
end

bundle exec rspec spec/workers/test_worker_spec.rb

像下面那样做,我得到:uninitialized constant TestWorker 需要 'spec_helper'

describe TestWorker do
  it "" do
   ....
  end
end

正如我所尝试的那样,gem rspec-sidekiq https://github.com/philostler/rspec-sidekiq

有人可以在 Rspec.

中提供用于测试 app/workers/ 的示例模板吗

谢谢。

我还没有使用 rspec-sidekiq gem,但是,这里是我如何检查使用 sidekiq

的后台作业的示例
# app/spec/workers/demo_worker_spec.rb

require 'rails_helper'
require 'sidekiq/testing'
Sidekiq::Testing.fake!

RSpec.describe DemoWorker, type: :worker do

  describe "Sidekiq Worker" do

    let (:demo) { FactoryGirl.create(:demo) }

    it "should respond to #perform" do
      expect(DemoWorker.new).to respond_to(:perform)
    end

    describe "Demo" do

      before do
        Sidekiq::Extensions.enable_delay!
        Sidekiq::Worker.clear_all
      end

      it "should enqueue a Email and SMS job" do
        assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
        Mailer.delay.demo_request(demo.id)
        assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
      end

    end

  end

end
  1. 我正在检查实例是否响应执行。
  2. 然后,我在计划作业之前和之后断言。

有时您可能想要测试的不仅仅是工作人员是否入队这一事实。

虽然最好将工人的 perform 块中可能发生的复杂事情分离,但它可以作为标准进行测试 class :

it { expect { MyWorker.new.perform }.to change { ...expectations... } }

it do
  MyWorker.new.perform
  ... expectations ..
end