Rails / Rspec:我如何测试#any?对于Sidekiq?

时间:2015-06-10 14:04:51

标签: rspec sidekiq

我有个街区:

def already_syncing?
  Sidekiq::Queue.new(queue_name).any? { |q| q.args[0] == car_id }
end

我该如何测试?如果我这样写出来:

allow(Sidekiq::Queue).to receive_message_chain(:new, :any?) { true }

然后我的实际块中的条件未经过测试。

1 个答案:

答案 0 :(得分:1)

我认为您所寻找的是and_yield

allow(Sidekiq::Queue).to receive_message_chain(:new, :any?).and_yield(<something>)

以下是您的一些示例代码/规范(使用我不知道的关于存根的值/方法调用),您可以自己尝试并根据需要进行更改:

class SyncTest
  def already_syncing?
    Sidekiq::Queue.new(queue_name).any? { |q| q.args[0] == car_id }
  end

  private # values for these methods below arbitrarily defined

  def queue_name
    'test'
  end

  def car_id
    1
  end
end

RSpec.describe SyncTest do
  let(:sync_test) { described_class.new }

  describe '#already_syncing?' do
    let(:queue) { double('queue') }
    let(:already_syncing) { sync_test.already_syncing? }

    before do
      # I don't have Sidekiq available for testing, so just say
      # it's a generic class.
      stub_const('Sidekiq::Queue', Class.new)
      allow(Sidekiq::Queue).to \
        receive_message_chain(:new, :any?).and_yield(queue)
    end

    context "when queue's args[0] == car_id" do
      before do
        allow(queue).to receive(:args).and_return([1])
      end

      it 'returns true' do
        expect(already_syncing).to be true
      end
    end

    context "when queue's args[0] != car_id" do
      before do
        allow(queue).to receive(:args).and_return([0])
      end

      it 'returns false' do
        expect(already_syncing).to be false
      end
    end
  end
end