Документы RSpe c имеют пример использования and_call_original
для настройки ответа только для одного указанного аргумента c, и на этом сайте есть ответов , демонстрирующие то же. Например,
allow(foo).to receive(:bar).and_call_original
allow(foo).to receive(:baz).with('qux').and_return('corge')
Но что, если я хочу сделать обратное? Что если я хочу вернуть ответ по умолчанию для большинства аргументов, но вызвать оригинальный метод только для одного аргумента? Я пробовал очевидное, и оно не работает -
allow(foo).to receive(:bar).and_return('corge')
allow(foo).to receive(:baz).with('qux').and_call_original
- вызов foo.baz('qux')
все еще возвращает 'corge'
, и оригинальный метод не вызывается.
Изменение порядка, таким образом:
allow(foo).to receive(:baz).with('qux').and_call_original
allow(foo).to receive(:bar).and_return('corge')
также не работает.
Я собрал воедино реализацию блока , которая работает по захватывать оригинальный метод как Method
объект, но он уродлив:
baz_orig = foo.method(:baz)
allow(foo).to receive(:baz) do |qux|
(qux == 'qux') ? baz_orig.call(qux) : 'corge'
end
Какой правильный способ сделать это?