RSpec - Stubs

Nếu bạn đã đọc phần RSpec Double (hay còn gọi là Mocks), thì bạn đã thấy RSpec Stubs. Trong RSpec, phần sơ khai thường được gọi là Method Stub, nó là một loại phương thức đặc biệt “đại diện” cho một phương thức hiện có hoặc cho một phương thức thậm chí chưa tồn tại.

Đây là mã từ phần trên RSpec Double -

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

Trong ví dụ của chúng ta, phương thức allow () cung cấp các sơ đồ phương thức mà chúng ta cần để kiểm tra lớp ClassRoom. Trong trường hợp này, chúng ta cần một đối tượng sẽ hoạt động giống như một thể hiện của lớp Sinh viên, nhưng lớp đó chưa thực sự tồn tại (chưa). Chúng ta biết rằng lớp Sinh viên cần cung cấp một phương thức name () và chúng ta sử dụng allow () để tạo một phương thức gốc cho name ().

Một điều cần lưu ý là, cú pháp của RSpec đã thay đổi một chút trong những năm qua. Trong các phiên bản cũ hơn của RSpec, các sơ khai của phương thức trên sẽ được định nghĩa như thế này:

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

Hãy lấy đoạn mã trên và thay thế hai allow() dòng với cú pháp RSpec cũ -

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

Bạn sẽ thấy đầu ra này khi thực thi đoạn mã trên -

.
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

Bạn nên sử dụng cú pháp allow () mới khi bạn cần tạo các sơ khai phương thức trong các ví dụ RSpec của mình, nhưng chúng tôi đã cung cấp kiểu cũ hơn ở đây để bạn có thể nhận ra nếu bạn nhìn thấy nó.