メインコンテンツまでスキップ

ユーザー定義のメタデータ

任意の例グループや例にユーザー定義のメタデータを添付することができます。describecontext、またはitの最後の引数(ブロックの前)としてハッシュを渡します。RSpecは、メタデータに基づいて特定の例またはグループにのみ適用される多くの設定オプションをサポートしています。

例グループに定義されたメタデータは、そのグループまたはサブグループの任意のサブグループまたは例から利用でき(オーバーライドも可能です)。

さらに、シンボルだけを使用してメタデータを指定することもできます。describecontext、またはitに渡された各シンボルは、メタデータハッシュ内のキーとなり、対応する値はtrueとなります。

ハッシュを使用してグループのメタデータを定義する

「define_group_metadata_with_hash_spec.rb」という名前のファイルがあるとします。

RSpec.describe "a group with user-defined metadata", :foo => 17 do
it 'has access to the metadata in the example' do |example|
expect(example.metadata[:foo]).to eq(17)
end

it 'does not have access to metadata defined on sub-groups' do |example|
expect(example.metadata).not_to include(:bar)
end

describe 'a sub-group with user-defined metadata', :bar => 12 do
it 'has access to the sub-group metadata' do |example|
expect(example.metadata[:bar]).to eq(12)
end

it 'also has access to metadata defined on parent groups' do |example|
expect(example.metadata[:foo]).to eq(17)
end
end
end

「rspec define_group_metadata_with_hash_spec.rb」と実行すると、すべての例がパスするはずです。

ハッシュを使用して例のメタデータを定義する

「define_example_metadata_with_hash_spec.rb」という名前のファイルがあるとします。

RSpec.describe "a group with no user-defined metadata" do
it 'has an example with metadata', :foo => 17 do |example|
expect(example.metadata[:foo]).to eq(17)
expect(example.metadata).not_to include(:bar)
end

it 'has another example with metadata', :bar => 12, :bazz => 33 do |example|
expect(example.metadata[:bar]).to eq(12)
expect(example.metadata[:bazz]).to eq(33)
expect(example.metadata).not_to include(:foo)
end
end

「rspec define_example_metadata_with_hash_spec.rb」と実行すると、すべての例がパスするはずです。

ユーザー定義のメタデータをオーバーライドする

「override_metadata_spec.rb」という名前のファイルがあるとします。

RSpec.describe "a group with user-defined metadata", :foo => 'bar' do
it 'can be overridden by an example', :foo => 'bazz' do |example|
expect(example.metadata[:foo]).to eq('bazz')
end

describe "a sub-group with an override", :foo => 'goo' do
it 'can be overridden by a sub-group' do |example|
expect(example.metadata[:foo]).to eq('goo')
end
end
end

「rspec override_metadata_spec.rb」と実行すると、すべての例がパスするはずです。

簡潔なメタデータ

「less_verbose_metadata_spec.rb」という名前のファイルがあるとします。

RSpec.describe "a group with simple metadata", :fast, :simple, :bug => 73 do
it 'has `:fast => true` metadata' do |example|
expect(example.metadata[:fast]).to eq(true)
end

it 'has `:simple => true` metadata' do |example|
expect(example.metadata[:simple]).to eq(true)
end

it 'can still use a hash for metadata' do |example|
expect(example.metadata[:bug]).to eq(73)
end

it 'can define simple metadata on an example', :special do |example|
expect(example.metadata[:special]).to eq(true)
end
end

「rspec less_verbose_metadata_spec.rb」と実行すると、すべての例がパスするはずです。