モジュール内でヘルパーメソッドを定義する
モジュール内でヘルパーメソッドを定義し、config.include
の設定オプションを使用して、そのモジュールを例のグループに含めることができます。config.extend
を使用すると、モジュールを例のグループに拡張して、モジュール内のメソッドを例のグループ自体で使用できるようにすることができます(ただし、実際の例では使用できません)。
また、最後の引数としてメタデータハッシュを渡すことで、特定の例のグループにのみモジュールを include
または extend
することもできます。指定したメタデータに一致するグループのみがモジュールを include
または extend
します。また、シンボルのみを使用してメタデータを指定することもできます。
なお、config.include
モジュールのメタデータに一致する例もモジュールが含まれるようになります。RSpecは、各例を単一の例グループ(Rubyのシングルトンクラスに類似)として扱い、単一の例を含むだけの例グループが存在すると見なします。
背景
以下の内容で "helpers.rb" という名前のファイルがあるとします:
module Helpers
def help
:available
end
end
すべての例グループにモジュールを含める
以下の内容で "include_module_spec.rb" という名前のファイルがあるとします:
require './helpers'
RSpec.configure do |c|
c.include Helpers
end
RSpec.describe "an example group" do
it "has access to the helper methods defined in the module" do
expect(help).to be(:available)
end
end
rspec include_module_spec.rb
を実行すると、
すべての例がパスするはずです。
すべての例グループにモジュールを拡張する
以下の内容で "extend_module_spec.rb" という名前のファイルがあるとします:
require './helpers'
RSpec.configure do |c|
c.extend Helpers
end
RSpec.describe "an example group" do
puts "Help is #{help}"
it "does not have access to the helper methods defined in the module" do
expect { help }.to raise_error(NameError)
end
end
rspec extend_module_spec.rb
を実行すると、
すべての例がパスするはずです。
かつ、出力に "Help is available" というテキストが含まれるはずです。
特定の例グループにモジュールを含める
以下の内容で "include_module_in_some_groups_spec.rb" という名前のファイルがあるとします:
require './helpers'
RSpec.configure do |c|
c.include Helpers, :foo => :bar
end
RSpec.describe "an example group with matching metadata", :foo => :bar do
it "has access to the helper methods defined in the module" do
expect(help).to be(:available)
end
end
RSpec.describe "an example group without matching metadata" do
it "does not have access to the helper methods defined in the module" do
expect { help }.to raise_error(NameError)
end
it "does have access when the example has matching metadata", :foo => :bar do
expect(help).to be(:available)
end
end
rspec include_module_in_some_groups_spec.rb
を実行すると、
すべての例がパスするはずです。
特定の例グループにモジュールを拡張する
以下の内容で "extend_module_in_only_some_groups_spec.rb" という名前のファイルがあるとします:
require './helpers'
RSpec.configure do |c|
c.extend Helpers, :foo => :bar
end
RSpec.describe "an example group with matching metadata", :foo => :bar do
puts "In a matching group, help is #{help}"
it "does not have access to the helper methods defined in the module" do
expect { help }.to raise_error(NameError)
end
end
RSpec.describe "an example group without matching metadata" do
puts "In a non-matching group, help is #{help rescue 'not available'}"
it "does not have access to the helper methods defined in the module" do
expect { help }.to raise_error(NameError)
end
end
rspec extend_module_in_only_some_groups_spec.rb
を実行すると、
すべての例がパスするはずです。
かつ、出力に "In a matching group, help is available" というテキストが含まれるはずです。
かつ、出力に "In a non-matching group, help is not available" というテキストが含まれるはずです。
シンボルをメタデータとして使用する
ファイル名が "symbols_as_metadata_spec.rb" の場合、以下のようなファイルがあるとします。
require './helpers'
RSpec.configure do |c|
c.include Helpers, :include_helpers
c.extend Helpers, :extend_helpers
end
RSpec.describe "an example group with matching include metadata", :include_helpers do
puts "In a group not matching the extend filter, help is #{help rescue 'not available'}"
it "has access to the helper methods defined in the module" do
expect(help).to be(:available)
end
end
RSpec.describe "an example group with matching extend metadata", :extend_helpers do
puts "In a group matching the extend filter, help is #{help}"
it "does not have access to the helper methods defined in the module" do
expect { help }.to raise_error(NameError)
end
end
rspec symbols_as_metadata_spec.rb
を実行すると、
すべての例がパスするはずです。
また、出力には "In a group not matching the extend filter, help is not available" という文言が含まれているはずです。
さらに、出力には "In a group matching the extend filter, help is available" という文言が含まれているはずです。