Ответ 1
Есть 2 отличия, но результат точно такой же. Оба относятся к синтаксису rspec mocks/expect.
-
Использование #allow вместо метода #stub. Первый случай использует новый синтаксис rspec, введенный в этом году. Теперь это предпочтительный способ использования rspec.. Хотя старый синтаксис не устарел, он, вероятно, будет отключен по умолчанию в rspec3. Дополнительная информация по этой теме от сопровождающего rspec: http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3
-
Использование блока вместо #and_return для определения возвращаемого значения. Это не имеет ничего общего с упомянутым изменением синтаксиса; оба подхода были доступны довольно долго (с rspec 1). Уместнее использовать метод #and_return, поскольку он (a) используется по умолчанию, (b) более читаемый и (c) поставляется без каких-либо служебных затрат времени исполнения. Второй подход с использованием блока обычно зарезервирован для угловых случаев, когда вы хотите вернуть что-то более динамичное - не постоянный, а какой-то расчет.
Ответ на ваш вопрос будет состоять в том, чтобы использовать комбинацию обоих:
- используйте #allow вместо #stub
- используйте #and_return вместо блока, если вам не нужно возвращать динамически рассчитанное значение
например:.
book = double('book')
allow(book).to receive(:title).and_return('The RSpec Book')