2015-06-10 6 views
1

У меня есть блок:Rails/Rspec: Как я могу проверить #any? для 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

Я думаю, что вы искали был 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