Если вы уже читали раздел о RSpec Doubles (он же Mocks), значит, вы уже видели заглушки RSpec. В RSpec заглушку часто называют заглушкой метода, это особый тип метода, который «заменяет» существующий метод или метод, который еще даже не существует.
Вот код из раздела на RSpec Doubles —
class ClassRoom def initialize(students) @students = students End def list_student_names @students.map(&:name).join(',') end end describe ClassRoom do it 'the list_student_names method should work correctly' do student1 = double('student') student2 = double('student') allow(student1).to receive(:name) { 'John Smith'} allow(student2).to receive(:name) { 'Jill Smith'} cr = ClassRoom.new [student1,student2] expect(cr.list_student_names).to eq('John Smith,Jill Smith') end end
В нашем примере метод allow () предоставляет заглушки метода, которые нам нужны для проверки класса ClassRoom. В этом случае нам нужен объект, который будет действовать как экземпляр класса Student, но этот класс на самом деле не существует (пока). Мы знаем, что класс Student должен предоставить метод name (), и мы используем allow () для создания заглушки метода для name ().
Стоит отметить, что синтаксис RSpec с годами немного изменился. В более старых версиях RSpec вышеприведенные заглушки метода были бы определены так:
student1.stub(:name).and_return('John Smith') student2.stub(:name).and_return('Jill Smith')
Давайте возьмем приведенный выше код и заменим две строки allow () старым синтаксисом RSpec —
class ClassRoom def initialize(students) @students = students end def list_student_names @students.map(&:name).join(',') end end describe ClassRoom do it 'the list_student_names method should work correctly' do student1 = double('student') student2 = double('student') student1.stub(:name).and_return('John Smith') student2.stub(:name).and_return('Jill Smith') cr = ClassRoom.new [student1,student2] expect(cr.list_student_names).to eq('John Smith,Jill Smith') end end
Вы увидите этот вывод, когда вы выполните приведенный выше код —
. Deprecation Warnings: Using `stub` from rspec-mocks' old `:should` syntax without explicitly enabling the syntax is deprec ated. Use the new `:expect` syntax or explicitly enable `:should` instead. Called from C:/rspec_tuto rial/spec/double_spec.rb:15:in `block (2 levels) in <top (required)>'. If you need more of the backtrace for any of these deprecations to identify where to make the necessary changes, you can configure `config.raise_errors_for_deprecations!`, and it will turn the deprecation warnings into errors, giving you the full backtrace. 1 deprecation warning total Finished in 0.002 seconds (files took 0.11401 seconds to load) 1 example, 0 failures
Рекомендуется использовать новый синтаксис allow (), когда вам нужно создать заглушки методов в ваших примерах RSpec, но мы предоставили здесь более старый стиль, чтобы вы могли его распознать, если увидите.