gpt4 book ai didi

ruby - 如何使用 rspec 为不同的调用产生不同的值

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:45 25 4
gpt4 key购买 nike

我正在尝试以与and_return 相同的方式使用and_yield。我希望它每次调用时都产生一个值...但是每次调用时它都会产生两次。

这个人为的例子说明了问题

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]

我是不是用错了?

最佳答案

如建议的那样,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

关于ruby - 如何使用 rspec 为不同的调用产生不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com