Search code examples
ruby-on-railsrspectest-double

Rspec expect to recieve message with attributes and ignore others


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?


Solution

  • 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?