Есть ли менее навязчивая альтернатива 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 thatmake_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
не мешая первоначальному вызову метода? Является ли моя проблема симптомом плохого дизайна?