I'm trying to write a spec for a really long time.
I need to test this:
expect(Foo).to receive(:bar).with(some_args)
and everything works just fine if Foo receives bar only once. But it will receive bar several times for sure so that the string above fails with
#<Foo (class)> received :bar with unexpected arguments
on those calls.
How can I test that Foo receives bar with the exact arguments I need and ignore other cases?
What about using allow(Foo).to receive(:bar).and_call_original?
For example, these tests will successfully pass:
class Foo
  def boo(b)
    b
  end
end
describe Foo do
  let(:a) { Foo.new }
  before do
    allow(a).to receive(:boo).and_call_original
  end
  it do
    expect(a).to receive(:boo).with(2)
    expect(a.boo(1)).to eq 1
    expect(a.boo(2)).to eq 2
    expect(a.boo(3)).to eq 3
  end
end
If you add expect(a).to receive(:boo).with(4) to the block, the test will fail. It seems like what you're looking for, right?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With