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

モジュール内でヘルパーメソッドを定義する

モジュール内でヘルパーメソッドを定義し、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" という文言が含まれているはずです。