Можно ли сказать rspec, чтобы предупредить меня, если заглушка возвращает объект другого типа, чем метод, который он заменяет? - PullRequest
0 голосов
/ 20 января 2012

У меня есть метод с именем save_title:

def save_title (data)
  ...  
  [ if the record exists, update, return 0] 
  [ if the record is new, create, return 1] 
end  

Все в порядке, пока я его не заглушил:

saved_rows = []
 proc.stub(:save_title) do |arg|
  saved_rows << arg
 end

Ошибка здесь в том, что Я использовалцелое число, возвращаемое из реального метода , чтобы определить, сколько записей было создано и обновлено.Заглушка не возвращает целое число.Oooops.Таким образом, код работал нормально в действительности, но в тесте выглядел неработающим.Некоторое время спустя (больше, чем я хочу признать, включая проклятие) я понимаю, что заглушка и реальный метод не ведут себя одинаково.Таковы подводные камни динамических языков, я полагаю.

Вопросы:

  1. Могу ли я попросить rspec предупредить меня, если заглушка не возвращает того же типа, что и реальный метод?
  2. Есть ли камень анализатора, который я могу использовать, чтобы предупредить об этом?
  3. Есть ли какая-то лучшая практика, о которой я не знаю, возвращая значения из методов?

1 Ответ

0 голосов
/ 20 января 2012

1) rspec не может знать, какой тип объекта должен возвращать метод, однако вы должны сказать это ...

2) Есть кое-что, на что вы можете посмотреть. Вместо того, чтобы использовать заглушку, попробуйте использовать макет вместо тестового двойника. По сути, это то же самое, что и заглушка, но вы можете выполнить еще много проверок ( см. Документацию здесь ). Такие вещи, как, сколько раз был вызван конкретный метод, с какими аргументами он должен быть вызван, и каким должно быть возвращаемое значение. Ваш тест не пройдёт, если ни одна из этих проверок не пройдёт.

3) Лучшей практикой будет само имя метода. Например, методы, заканчивающиеся на? как object.exists? всегда должен возвращать логическое значение. В вашем случае я бы предложил рефакторинг вашего метода, возможно, разделил бы его на две части, одну для обновления и одну для создания, и предложите другой метод, чтобы сообщить вам, существует объект или нет. Не рекомендуется, чтобы метод вел себя двумя различными способами в зависимости от ввода (см. разделение интересов )

Удачи! надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...