RSpec - Siêu dữ liệu
RSpec là một công cụ linh hoạt và mạnh mẽ. Chức năng Siêu dữ liệu trong RSpec cũng không ngoại lệ. Siêu dữ liệu thường đề cập đến "dữ liệu về dữ liệu". Trong RSpec, điều này có nghĩa là dữ liệu vềdescribe, context và it blocks.
Hãy xem một ví dụ -
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
Khi bạn chạy đoạn mã trên, bạn sẽ thấy đầu ra này:
..
Finished in 0.002 seconds (files took 0.11301 seconds to load)
2 examples, 0 failures
Siêu dữ liệu cung cấp một cách để gán các biến ở các phạm vi khác nhau trong các tệp RSpec của bạn. Biến example.metadata là một hàm băm Ruby chứa thông tin khác về các Ví dụ và nhóm Ví dụ của bạn.
Ví dụ: hãy viết lại đoạn mã trên để trông giống như sau:
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
Khi chúng tôi chạy mã này, chúng tôi thấy tất cả các giá trị trong băm 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
Rất có thể, bạn sẽ không cần phải sử dụng tất cả siêu dữ liệu này, nhưng hãy xem giá trị mô tả đầy đủ -
Nhóm mẫu có biến siêu dữ liệu và ngữ cảnh có biến khác có thể truy cập biến siêu dữ liệu trong khối ngữ cảnh.
Đây là một câu được tạo từ mô tả khối mô tả + mô tả khối ngữ cảnh chứa trong nó + mô tả cho it block.
Điều thú vị cần lưu ý ở đây là, ba chuỗi này cùng nhau đọc giống như một câu tiếng Anh bình thường. . . là một trong những ý tưởng đằng sau RSpec, có các bài kiểm tra giống như mô tả hành vi bằng tiếng Anh.