How to get different values ββfor different calls using rspec
I am trying to use the and_yield
same way it works and_return
. i want it to give ONE a value every time it is called ... however it gives TWICE every time it is called.
this contrived example shows the problem
class Yielder
@@blocks = []
def self.yielder; end
def self.blocks= b; @@blocks << b; end
def self.blocks; @@blocks; end
end
describe Yielder do
it 'should yield twice' do
allow(Yielder).to receive(:yielder).and_yield(:foo).and_yield(:bar)
2.times do
Yielder.yielder do |y|
Yielder.blocks = y
end
end
expect(Yielder).to have_received(:yielder).twice
expect(Yielder.blocks).to eq [:foo, :bar]
end
end
Rspec results ...
expected: [:foo, :bar]
got: [:foo, :bar, :foo, :bar]
Am I using this wrong?
+3
source to share
1 answer
As suggested, it and_yield
doesn't work the way it does and_return
. But if you want this behavior, you can do the following:
describe Yielder do
it 'should yield twice' do
values = [:foo, :bar]
allow(Yielder).to receive(:yielder) do |&block|
block.call(values.shift)
end
2.times do
Yielder.yielder do |y|
Yielder.blocks = y
end
end
expect(Yielder).to have_received(:yielder).twice
expect(Yielder.blocks).to eq [:foo, :bar]
end
end
+3
source to share