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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top