Подтвердить что ты не робот

Разрешить против Stub, какая разница?

В чем разница между следующими строками кода (rspec) и независимо от того, являются ли они одинаковыми или разными, когда вы должны использовать один вместо другого?

book = double("book")
allow(book).to receive(:title) { "The RSpec Book" }

против

book = double("book")
book.stub(:title).and_return("The RSpec Book")
4b9b3361

Ответ 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')