RSpec – 元数据
RSpec – 元数据
RSpec 是一个灵活而强大的工具。RSpec 中的元数据功能也不例外。元数据一般是指“关于数据的数据”。在 RSpec 中,这意味着有关您的describe、context和it blocks 的数据。
让我们看一个例子 –
RSpec.describe "An Example Group with a metadata variable", :foo => 17 do context 'and a context with another variable', :bar => 12 do it 'can access the metadata variable of the outer Example Group' do |example| expect(example.metadata[:foo]).to eq(17) end it 'can access the metadata variable in the context block' do |example| expect(example.metadata[:bar]).to eq(12) end end end
当你运行上面的代码时,你会看到这个输出 –
.. Finished in 0.002 seconds (files took 0.11301 seconds to load) 2 examples, 0 failures
元数据提供了一种在 RSpec 文件中的不同范围内分配变量的方法。example.metadata 变量是一个 Ruby 哈希,它包含有关您的示例和示例组的其他信息。
例如,让我们重写上面的代码看起来像这样 –
RSpec.describe "An Example Group with a metadata variable", :foo => 17 do context 'and a context with another variable', :bar => 12 do it 'can access the metadata variable in the context block' do |example| expect(example.metadata[:foo]).to eq(17) expect(example.metadata[:bar]).to eq(12) example.metadata.each do |k,v| puts "#{k}: #{v}" end end end
当我们运行此代码时,我们会看到 example.metadata 哈希中的所有值 –
.execution_result: #<RSpec::Core::Example::ExecutionResult:0x00000002befd50> block: #<Proc:0x00000002bf81a8@C:/rspec_tutorial/spec/metadata_spec.rb:7> description_args: ["can access the metadata variable in the context block"] description: can access the metadata variable in the context block full_description: An Example Group with a metadata variable and a context with another variable can access the metadata variable in the context block described_class: file_path: ./metadata_spec.rb line_number: 7 location: ./metadata_spec.rb:7 absolute_file_path: C:/rspec_tutorial/spec/metadata_spec.rb rerun_file_path: ./metadata_spec.rb scoped_id: 1:1:2 foo: 17 bar: 12 example_group: {:execution_result=>#<RSpec::Core::Example::ExecutionResult: 0x00000002bfa0e8>, :block=>#< Proc:0x00000002bfac00@C:/rspec_tutorial/spec/metadata_spec.rb:2>, :description_args=>["and a context with another variable"], :description=>"and a context with another variable", :full_description=>"An Example Group with a metadata variable and a context with another variable", :described_class=>nil, :file_path=>"./metadata_spec.rb", :line_number=>2, :location=>"./metadata_spec.rb:2", :absolute_file_path=>"C:/rspec_tutorial/spec/metadata_spec.rb", :rerun_file_path=>"./metadata_spec.rb", :scoped_id=>"1:1", :foo=>17, :parent_example_group=> {:execution_result=>#< RSpec::Core::Example::ExecutionResult:0x00000002c1f690>, :block=>#<Proc:0x00000002baff70@C:/rspec_tutorial/spec/metadata_spec.rb:1> , :description_args=>["An Example Group with a metadata variable"], :description=>"An Example Group with a metadata variable", :full_description=>"An Example Group with a metadata variable", :described_class=>nil, :file_path=>"./metadata_spec.rb", :line_number=>1, :location=>"./metadata_spec.rb:1", :absolute_file_path=> "C:/rspec_tutorial/spec/metadata_spec.rb", :rerun_file_path=>"./metadata_spec.rb", :scoped_id=>"1", :foo=>17}, :bar=>12}shared_group_inclusion_backtrace: [] last_run_status: unknown . . Finished in 0.004 seconds (files took 0.11101 seconds to load) 2 examples, 0 failures
很可能,您不需要使用所有这些元数据,而是查看完整的描述值 –
具有元数据变量和具有另一个变量的上下文的示例组可以访问上下文块中的元数据变量。
这是从描述块描述+其包含的上下文块描述+ it块的描述创建的句子。
这里有趣的是,这三个字符串一起读起来就像一个普通的英语句子。. . 这是 RSpec 背后的想法之一,测试听起来像英语的行为描述。