📅  最后修改于: 2020-12-06 10:56:16             🧑  作者: Mango
如果您已经阅读了RSpec Doubles(又名Mocks)一节,那么您已经看过RSpec Stubs。在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')
让我们采用上面的代码,并用旧的RSpec语法替换两条allow()行:
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 '.
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
当需要在RSpec示例中创建方法存根时,建议使用新的allow()语法,但是我们在此处提供了较旧的样式,以便您看到它时就可以识别它。