Убедитесь, что метод был вызван с аргументами в некоторый момент во время теста

Я хочу убедиться, что мой Foo.bar метод вызывается с true в какой-то момент во время моего теста. До сих пор я мог только утверждать против первого звонка Foo.bar, Я должен утверждать против любого вызова.

Это то, что я до сих пор, но не работает:

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

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

Это терпит неудачу на первом Foo.bar потому что "ложь" не соответствует моим "истинным" ожиданиям. Как бы вы переписали это, чтобы пройти, потому что Foo.bar("true") вызывается в какой-то момент во время теста?

1 ответ

Решение

Я думаю, что в этом случае вам нужно будет делать то, что я считаю методом, эквивалентным 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
Другие вопросы по тегам