Есть ли менее навязчивая альтернатива Rspec `should_receive`?

При написании тестов Rspec я часто бываю разочарованshould_receive, Я хотел бы знать, есть ли менее навязчивая альтернатива.

Например:

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

Призыв кshould_receive хорошее описание, но оно нарушает мой код, потому чтоshould_receive работает, маскируя оригинальный метод, иmake_cake не может продолжаться, еслиmake_batter на самом деле возвращает тесто. Поэтому я изменяю это на это:

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

Это ужасно, потому что:

It looks like I'm testing that make_batter correctly returns @batter, but I'm actually forcing the fake version of make_batter to return that. It forces me to separately set up @batter If make_batter has any important side effects (which could be a code smell, I suppose) I have to make those happen, too.

я желаю этоshould_receive(:make_batter) проверит вызов метода иpass it on to the original method, Если бы я хотел заглушить его поведение для лучшего тестирования изоляции, я бы сделал это явно:@baker.stub(:make_batter).and_return(@batter).

Есть ли способ сделать что-то вродеshould_receive не мешая первоначальному вызову метода? Является ли моя проблема симптомом плохого дизайна?

Ответы на вопрос(3)

Ваш ответ на вопрос