如何使用rspec为不同的调用生成不同的值

时间:2014-12-16 19:08:45

标签: ruby rspec

我尝试使用and_yieldand_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]
我是不是错误地使用了这个?

1 个答案:

答案 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