Учебники

RSpec — заглушки

Если вы уже читали раздел о 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, но мы предоставили здесь более старый стиль, чтобы вы могли его распознать, если увидите.