Bei der aufgerufenen Methode double, Erwartungen an das Argument
Frage
Ich habe ein Double erstellt und führe Code aus, der es mit einer Methode und einem großen Hash als Argument aufruft. Ich möchte einen Schlüssel des Arguments überprüfen und dann einen bestimmten Hash zurückgeben.
Das ist es, was ich tue
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
Was passiert, ist das erste Mal do_stuff
aufgerufen wird, kehrt es zurück true
Das ist das Ergebnis der receive
blockieren, aber bei nachfolgenden Aufrufen (getestet in Pry) wird es korrekt zurückgegeben {stuff: 42}
aber da der erste Aufruf falsch ist, gibt meine Methode beim Aufrufversuch eine Ausnahme aus[:stuff]
bei der Rückkehr.
Ich versuche zu lassen allow
Definieren Sie das Verhalten des Doubles, sodass ich die Rückgabe nicht am Ende des Doubles platzieren möchte expect
..aber gibt es einen Ausweg?
Lösung
Ich habe herausgefunden, dass die Antwort bisher darin besteht, ein zu verwenden undokumentierter Argument-Matcher hash_including
ähnlich wie mein erster Kommentar
expect(@my_double).to receive(:do_stuff).with(hash_including(my_arg: 3))
Das funktioniert gut.