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]