【问题标题】:RSPEC trying to confirm Class gets calledRSPEC 试图确认 Class 被调用
【发布时间】:2021-08-14 00:27:19
【问题描述】:

我正在使用 Sidekiq 中的并发功能,并想确认 Sidekiq::Limiter 是否被调用。我收到以下错误:

Failures:

  1) Op::QueueProcessing#perform concurrency is concurrent per client
     Failure/Error: expect(Sidekiq::Limiter).to have_received(:unlimited)
     
       (Sidekiq::Limiter).unlimited(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments
     # ./spec/workers/op/queue_processing_spec.rb:24:in `block (4 levels) in <top (required)>'
     # ./spec/support/timezone.rb:9:in `block (3 levels) in <top (required)>'
     # ./spec/support/timezone.rb:9:in `block (2 levels) in <top (required)>'

工人阶级:

# frozen_string_literal: true

module Op
  class QueueProcessing
    include Sidekiq::Worker

    def self.throttle
      return Sidekiq::Limiter.unlimited if Rails.env.test?

      Sidekiq::Limiter.concurrent(
        'analytics',
        1,
        wait_timeout: 5,
        lock_timeout: 120
      )
    end

    LIMITER = throttle

    def perform
      uploaded_submissions = OnClaimsSubmission.uploaded_submissions
      uploaded_submissions.each do |submission|
        LIMITER.within_limit do
          Op::ProcessDownloadedFiles.perform_async(*submission)
        end
      end
    end
  end
end

测试:

# frozen_string_literal: true

require 'rails_helper'

describe Op::QueueProcessing do
  describe '#perform' do
    let(:job) { described_class.new }

    context 'concurrency' do
      before do
        allow(Sidekiq::Limiter).to receive(:unlimited)
        job.perform
      end

      it 'is concurrent per client' do
        expect(Sidekiq::Limiter).to have_received(:unlimited)
      end
    end
  end
end

【问题讨论】:

    标签: rspec sidekiq


    【解决方案1】:

    我猜这是因为LIMITER = throttle 是类定义的一部分,并且在加载文件时执行,当您的规范助手需要您的 ruby​​ 文件时会发生这种情况。

    执行测试时未调用该方法,因此失败。

    一个比较简单的改变就是改变:

    LIMITER.within_limit do
    

    self.class.throttle.within_limit do
    

    但是,这会产生(可能可以忽略不计的)性能影响。

    否则,您需要测试在加载时分配的 Op::QueueProcesssing::LIMITER 的值。例如,期望Op::QueueProcesssing::LIMITER.is_a?(Sidekiq::Limiter::Unlimited)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多