Rails / Rspec:我将如何测试#any?对于 Sidekiq?
Rails / Rspec: How would I test #any? for 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 }
那我实际block里面的条件没有测试
我想你要找的是 and_yield
:
allow(Sidekiq::Queue).to receive_message_chain(:new, :any?).and_yield(<something>)
这里有一些示例 code/specs(其中 values/method 个我不知道的调用已被删除),您可以自己尝试并根据需要进行更改:
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
我有一个块:
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 }
那我实际block里面的条件没有测试
我想你要找的是 and_yield
:
allow(Sidekiq::Queue).to receive_message_chain(:new, :any?).and_yield(<something>)
这里有一些示例 code/specs(其中 values/method 个我不知道的调用已被删除),您可以自己尝试并根据需要进行更改:
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