Question

J'ai créé un double, je suis l'exécution de code qui va appeler une méthode et un énorme hachage comme un argument, je veux vérifier une des clés de l'argumentation, et ensuite de retour à un spécifique de hachage.

C'est ce que je fais

before :each do
  allow(@my_double).to receive(:do_stuff).and_return({stuff: 42})
end
it "can do stuff" do
  expect(@my_double).to receive(:do_stuff) do  |arg|
    expect(arg).to be_a(Hash)
    expect(arg[:my_arg]).to eq(3)
  end
  TestObject.stuff() # will invoke do_stuff on the double
end

Ce qui se passe est la première fois do_stuff est appelée, elle retourne true qui est le résultat de la receive bloc, mais sur les appels suivants(testé dans pry), il renvoie correctement {stuff: 42} mais depuis le premier appel est faux, ma méthode exceptions quand il essaie de l'appeler[:stuff] sur le retour.

Je suis en train de laisser allow définir le comportement de la double donc je ne veux pas mettre le retour dans le bas de la expect..mais est-il un moyen de contourner cela?

Était-ce utile?

La solution

Compris la réponse est d'utiliser un encore sans-papiers argument matcher hash_including un peu comme mon premier commentaire

expect(@my_double).to receive(:do_stuff).with(hash_including(my_arg: 3))

Cela fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top