Czy istnieje mniej inwazyjna alternatywa dla `should_receive` Rspec?

Pisząc testy Rspec, często jestem sfrustrowanyshould_receive. Chciałbym wiedzieć, czy istnieje mniej inwazyjna alternatywa.

Na przykład:

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

Wezwanie doshould_receive to dobry opis, ale łamie mój kod, ponieważshould_receive działa poprzez maskowanie oryginalnej metody imake_cake nie może kontynuować, chyba żemake_batter faktycznie zwraca jakieś ciasto. Zmieniłem to na to:

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

To brzydkie, ponieważ:

Towygląda jak testuję tomake_batter poprawnie zwraca@batter, ale ja jestemtak właściwie wymuszanie fałszywej wersjimake_batter aby to zwrócić.Wymusza na mnie osobną konfigurację@batterJeślimake_batter ma jakieś ważne skutki uboczne (co może być zapachem kodu, jak przypuszczam). Muszę też to zrobić.

Życzę tegoshould_receive(:make_batter) zweryfikuje wywołanie metody iprzekaż ją do oryginalnej metody. Gdybym chciał ograniczyć swoje zachowanie do lepszych testów izolacji, zrobiłbym to wyraźnie:@baker.stub(:make_batter).and_return(@batter).

Czy istnieje sposób na zrobienie czegoś takiegoshould_receive bez uniemożliwiania oryginalnego wywołania metody? Czy mój problem jest objawem złego projektu?

questionAnswers(3)

yourAnswerToTheQuestion