При написании тестов 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
, не предотвращая вызов исходного метода? Является ли моя проблема симптомом плохого дизайна?