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

グローバル名前空間DSL

RSpecには、以下のいくつかのトップレベルの構造があり、振る舞いを記述することができます。

  • RSpec.describe: グループの例を記述するための名前付きコンテキストを定義します。

  • RSpec.shared_examples: 後で例のグループに含めることができる共有の例を定義します。

  • RSpec.shared_context: 後で例のグループに含めることができる共通のコンテキスト(beforelet、ヘルパーメソッドなどを使用)を定義します。

これらの構造は、これまでメインオブジェクトから直接利用できるようになっていました。そのため、RSpec.の接頭辞なしでファイルの先頭でこれらを使用することができました。また、クラスやモジュールからも利用できるようになっており、例を特定の定数名前空間内にスコープすることができます。

RSpec 3では、このグローバルなモンキーパッチを無効にするオプションが提供されています。

config.expose_dsl_globally = false

後方互換性のため、デフォルトではtrueに設定されています。

デフォルトではRSpecはグローバルなDSLの使用を許可します

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします:

describe "specs here" do
it "passes" do
end
end

rspecを実行すると

出力には「1 example, 0 failures」という文字列が含まれているはずです。

デフォルトではrspec/autorunはグローバルなDSLの使用を許可します

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします:

require 'rspec/autorun'
describe "specs here" do
it "passes" do
end
end

ruby spec/example_spec.rbを実行すると

出力には「1 example, 0 failures」という文字列が含まれているはずです。

グローバルな公開が無効になっている場合、トップレベルのDSLは機能しません

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします:

RSpec.configure { |c| c.expose_dsl_globally = false }
describe "specs here" do
it "passes" do
end
end

rspecを実行すると

出力には「undefined method `describe'」という文字列が含まれているはずです。

設定に関係なく

次の内容で「spec/example_spec.rb」という名前のファイルがあるとします:

RSpec.configure { |c| c.expose_dsl_globally = true }
RSpec.describe "specs here" do
it "passes" do
end
end

rspecを実行すると

出力には「1 example, 0 failures」という文字列が含まれているはずです。