I want to ensure that my Foo.bar method is called with true at some point during my test. So far I've only been able to assert against the first call to Foo.bar. I need to assert against any call.

This is what I have so far but doesn't work:

  expect(Foo).to receive(:bar).at_least(:once).with("true")

  Foo.bar("false")
  Foo.bar("false")
  Foo.bar("true")
  Foo.bar("false")

It fails on the first Foo.bar because "false" doesn't match my "true" expectation. How would you rewrite this to pass because Foo.bar("true") is called at some point during the test?

有帮助吗?

解决方案

I think that in this case you would need to do what I think of as the method stubbing equivalent of as_null_object:

describe Foo
  describe 'testing .bar multiple times' do
    before do
      allow(Foo).to receive(:bar) # stub out message
    end

    it "can determine how many times it has been called with 'true'" do
      expect(Foo).to receive(:bar).at_least(:once).with("true")
      expect(Foo).to receive(:bar).at_most(:once).with("true")
      Foo.bar("false")
      Foo.bar("false")
      Foo.bar("true")
      Foo.bar("false")
    end
  end
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top