RSpec – 存根
RSpec – 存根
如果您已经阅读了有关 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 <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
当您需要在 RSpec 示例中创建方法存根时,建议您使用新的 allow() 语法,但我们在此处提供了旧样式,以便您在看到它时会认出它。