RSpec: как проверить, вызван ли метод?

При написании тестов RSpec я нахожу, что пишу много кода, который выглядит так, чтобы гарантировать, что метод был вызван во время выполнения теста (ради аргумента, позвольте сказать, что я не могу опросить состояние объекта после вызова, потому что операция, которую выполняет метод, не просто увидеть эффект).

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
    called_bar = false
    subject.stub(:bar).with("an argument I want") { called_bar = true }
    subject.foo
    expect(called_bar).to be_true
  end
end

Я хочу знать: есть ли более синтаксис, чем этот? Неужели я пропустил какую-то фанкную ​​RSpec-удивительность, которая снизила бы приведенный выше код до нескольких строк? should_receive звучит так, будто он должен это делать, но, читая дальше, звучит так, как будто это не совсем то, что он делает.

Ответ 1

it "should call 'bar' with appropriate arguments" do
  expect(subject).to receive(:bar).with("an argument I want")
  subject.foo
end

Ответ 2

В новом rspec expect синтаксисе это будет:

expect(subject).to receive(:bar).with("an argument I want")

Ответ 3

Ниже должно работать

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
     subject.stub(:bar)
     subject.foo
     expect(subject).to have_received(:bar).with("Invalid number of arguments")
  end
end

Документация: https://github.com/rspec/rspec-mocks#expecting-arguments