web-dev-qa-db-fra.com

RSpec: comment vérifier si une méthode a été appelée?

Lors de l'écriture de tests RSpec, je me retrouve à écrire beaucoup de code ressemblant à ceci afin de m'assurer qu'une méthode a été appelée lors de l'exécution d'un test (par souci d'argument, disons simplement que je ne peux pas vraiment interroger l'état de l’objet après l’appel car l’opération effectuée par la méthode n’est pas facile à voir l’effet de).

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

Ce que je veux savoir, c'est: existe-t-il une syntaxe plus agréable que celle-ci? Est-ce que je manque quelque chose de génial RSpec génial qui réduirait le code ci-dessus à quelques lignes? should_receive semble vouloir le faire, mais si on lit plus loin, on dirait que ce n'est pas exactement ce que ça fait.

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

Dans la nouvelle rspecexpect syntaxe , ce serait:

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

Le ci-dessous devrait fonctionner

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

Documentation: https://github.com/rspec/rspec-mocks#expecting-arguments

33
bjhaid