Ruby 如何使用rspec为不同的调用生成不同的值
我尝试使用Ruby 如何使用rspec为不同的调用生成不同的值,ruby,rspec,Ruby,Rspec,我尝试使用和_yield的方式与和_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
和_yield
的方式与和_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
我是不是用错了?正如建议的那样,
和_yield
的工作方式与和_return
的工作方式不一样。但如果你想要这种行为,你可以做以下几点:
它“应该屈服两次”去做
值=[:foo,:bar]
允许(Yielder)。接收(:Yielder)do |阻塞(&block)|
block.call(values.shift)
结束
2.5倍
Yielder.Yielder do|y|
Yielder.blocks=y
结束
结束
期待(Yielder)。收到(Yielder)。两次
expect(Yielder.blocks).到等式[:foo,:bar]
结束
结束
根据,这是预期的行为。使用与和_return相同的语法,行为不同。我想用同样的方法测试和_yield
。我怀疑您想要的实际上不受支持:-(我的回答假设传递一个块会起作用,但实际上该块在代码中运行,其结果被忽略(!)请注意,您可以使用expect()执行此操作
也一样,但您需要使用两次,准确地说是(3).次,等等。
expected: [:foo, :bar]
got: [:foo, :bar, :foo, :bar]