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ó.