RSpec - Stubs

Wenn Sie den Abschnitt über RSpec Doubles (auch bekannt als Mocks) bereits gelesen haben, haben Sie RSpec Stubs bereits gesehen. In RSpec wird ein Stub oft als Methodenstub bezeichnet. Dies ist eine spezielle Art von Methode, die für eine vorhandene Methode oder für eine Methode, die noch nicht einmal existiert, „steht“.

Hier ist der Code aus dem Abschnitt über 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

In unserem Beispiel stellt die Methode allow () die Methodenstubs bereit, die zum Testen der ClassRoom-Klasse erforderlich sind. In diesem Fall benötigen wir ein Objekt, das sich wie eine Instanz der Student-Klasse verhält, aber diese Klasse existiert (noch) nicht. Wir wissen, dass die Student-Klasse eine name () -Methode bereitstellen muss, und wir verwenden allow (), um einen Methodenstub für name () zu erstellen.

Zu beachten ist, dass sich die Syntax von RSpec im Laufe der Jahre etwas geändert hat. In älteren Versionen von RSpec würden die obigen Methodenstubs wie folgt definiert:

student1.stub(:name).and_return('John Smith') 
student2.stub(:name).and_return('Jill Smith')

Nehmen wir den obigen Code und ersetzen Sie die beiden allow() Zeilen mit der alten RSpec-Syntax -

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

Sie sehen diese Ausgabe, wenn Sie den obigen Code ausführen -

.
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

Es wird empfohlen, die neue allow () -Syntax zu verwenden, wenn Sie Methodenstubs in Ihren RSpec-Beispielen erstellen müssen. Wir haben hier jedoch den älteren Stil bereitgestellt, damit Sie ihn erkennen, wenn Sie ihn sehen.