How to get different values ​​for different calls using rspec

I am trying to use the and_yield

same way it works and_return

. i want it to give ONE a value every time it is called ... however it gives TWICE every time it is called.

this contrived example shows the problem

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 results ...

       expected: [:foo, :bar]
            got: [:foo, :bar, :foo, :bar]

      

Am I using this wrong?

+3


source to share


1 answer


As suggested, it and_yield

doesn't work the way it does and_return

. But if you want this behavior, you can do the following:



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 

      

+3


source







All Articles