Используйте RSpe c and_call_original только для одного указанного c аргумента - PullRequest
0 голосов
/ 19 марта 2020

Документы 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

Какой правильный способ сделать это?

...