Lors de l'écriture de tests RSpec, je me retrouve à écrire beaucoup de code qui ressemble à ceci afin de m'assurer qu'une méthode a été appelée lors de l'exécution d'un test (pour des raisons 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: y a-t-il une meilleure syntaxe disponible que celle-ci? Est-ce que je manque une génialité RSpec géniale qui réduirait le code ci-dessus à quelques lignes? should_receive
On dirait qu'il devrait le faire, mais en lisant plus loin, il semble que ce n'est pas exactement ce qu'il fait.
ruby-on-rails
ruby
rspec
Mikey Hogarth
la source
la source
should_receive
, alors j'ai pensé que cette question aiderait.Réponses:
la source
called_bar
. C'était juste un drapeau pour s'assurer que la méthode a été appelée, mais avecexpect(...).to receive(...)
vous, vous couvrez déjà cela. C'est plus clair et sémantiqueDans la nouvelle
rspec
expect
syntaxe, ce serait:la source
Le ci-dessous devrait fonctionner
Documentation: https://github.com/rspec/rspec-mocks#expecting-arguments
la source
have_received
(l'approche des "espions" après coup), nonhas_received
, qui ne fait partie d'aucune version de RSpec que je connaisse.Pour vous conformer pleinement à la syntaxe RSpec ~> 3.1 et à
rubocop-rspec
l'option par défaut de la règleRSpec/MessageSpies
, voici ce que vous pouvez faire avecspy
:Si vous n'utilisez pas rubocop-rspec ou n'utilisez pas l'option par défaut. Vous pouvez, bien sûr, utiliser RSpec 3 default avec expect.
la source