Gibt es eine weniger aufdringliche Alternative zu Rspecs `should_receive`?

Beim Schreiben von Rspec-Tests bin ich oft frustriertshould_receive. Ich würde gerne wissen, ob es eine weniger aufdringliche Alternative gibt.

Zum Beispiel:

describe "making a cake" do
  it "should use some other methods" do
    @baker.should_receive(:make_batter)
    @baker.make_cake
  end
end

Der Anruf nachshould_receive ist eine gute beschreibung, aber sie bricht meinen code, weilshould_receive funktioniert durch Maskieren der ursprünglichen Methode, undmake_cake Ich kann nicht weitermachen, es sei dennmake_batter gibt tatsächlich etwas Teig zurück. Also ändere ich es so:

@baker.should_receive(:make_batter).and_return(@batter)

Das ist hässlich, weil:

Essieht aus als würde ich das testenmake_batter richtig kehrt zurück@batter, aber ich bintatsächlich Erzwingen der gefälschten Version vonmake_batter um das zurückzugeben.Es zwingt mich, mich separat einzurichten@batterObmake_batter hat alle wichtigen Nebenwirkungen (die ein Code-Geruch sein könnten, nehme ich an), die ich auch passieren lassen muss.

ich wünsche mir, dassshould_receive(:make_batter) würde den Methodenaufruf und verifizierenleiten Sie es an die ursprüngliche Methode weiter. Wenn ich sein Verhalten für bessere Isolationstests unterbinden wollte, würde ich dies explizit tun:@baker.stub(:make_batter).and_return(@batter).

Gibt es eine Möglichkeit, so etwas zu tun?should_receive ohne den ursprünglichen Methodenaufruf zu verhindern? Ist mein Problem ein Symptom für schlechtes Design?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage