При написании тестов 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)
Это уродливо, потому что:
- Он выглядит, как будто я тестирую, что
make_batterкорректно возвращает@batter, но я на самом деле, вызывая поддельную версиюmake_batter, чтобы вернуть это. - Это заставляет меня отдельно настраивать
@batter - Если
make_batterимеет какие-либо важные побочные эффекты (что может быть запахом кода, я полагаю), я тоже должен сделать это.
Я хочу, чтобы should_receive(:make_batter) проверил вызов метода и передал его оригинальному методу. Если бы я хотел заглушить его поведение для лучшего тестирования изоляции, я бы сделал это явно: @baker.stub(:make_batter).and_return(@batter).
Есть ли способ сделать что-то вроде should_receive, не предотвращая вызов исходного метода? Является ли моя проблема симптомом плохого дизайна?