【问题标题】:How to test a Sidekiq worker with RSpec?如何使用 RSpec 测试 Sidekiq 工作人员?
【发布时间】:2019-01-16 11:07:03
【问题描述】:

我正在使用 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/

谢谢。

【问题讨论】:

    标签: ruby-on-rails rspec rspec-rails sidekiq rspec-sidekiq


    【解决方案1】:

    我没有使用 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. 然后,我在作业安排之前和之后断言。

    【讨论】:

    • 谢谢它有效,我之前搞混了。关于使用 sidekiq_options 进行检查的任何想法:queue => my_queue like it { is_expected.to be_processed_in :my_queue }
    • 您要测试队列吗?如果是这样,请看这里 - github.com/mperham/sidekiq/wiki/Testing#queue-api-40。不过我还没试过。
    • 只是想检查队列名称是否存在 :)
    • 试试this
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-10
      • 2017-02-11
      • 2021-10-31
      • 2013-09-16
      • 2020-11-17
      • 2018-11-05
      • 2013-03-21
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多