我尝试使用and_yield
与and_return
的工作方式相同。我希望它每次调用时产生一个值...但是每次调用它时都会产生两次值。
这个人为的例子显示了这个问题
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结果......
expected: [:foo, :bar]
got: [:foo, :bar, :foo, :bar]
我是不是错误地使用了这个?
答案 0 :(得分:4)
根据建议,and_yield
的工作方式与and_return
的工作方式相同。但如果您想要这种行为,您可以执行以下操作:
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