Module: RSpec::Core::DSL

Defined in:
lib/rspec/core/dsl.rb

Overview

DSL defines methods to group examples, most notably `describe`, and exposes them as class methods of RSpec. They can also be exposed globally (on `main` and instances of `Module`) through the Configuration option `expose_dsl_globally`.

By default the methods `describe`, `context` and `example_group` are exposed. These methods define a named context for one or more examples. The given block is evaluated in the context of a generated subclass of ExampleGroup.

## Examples:

RSpec.describe "something" do
  context "when something is a certain way" do
    it "does something" do
      # example code goes here
    end
  end
end

See Also:

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.top_levelObject



53
54
55
# File 'lib/rspec/core/dsl.rb', line 53

def top_level
  @top_level
end

Class Method Details

.change_global_dsl(&changes) ⇒ Object



89
90
91
92
# File 'lib/rspec/core/dsl.rb', line 89

def self.change_global_dsl(&changes)
  (class << top_level; self; end).class_exec(&changes)
  Module.class_exec(&changes)
end

.example_group_aliasesObject



27
28
29
# File 'lib/rspec/core/dsl.rb', line 27

def self.example_group_aliases
  @example_group_aliases ||= []
end

.expose_example_group_alias(name) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/rspec/core/dsl.rb', line 37

def self.expose_example_group_alias(name)
  return if example_group_aliases.include?(name)

  example_group_aliases << name

  (class << RSpec; self; end).__send__(:define_method, name) do |*args, &example_group_block|
    group = RSpec::Core::ExampleGroup.__send__(name, *args, &example_group_block)
    RSpec.world.record(group)
    group
  end

  expose_example_group_alias_globally(name) if exposed_globally?
end

.expose_example_group_alias_globally(method_name) ⇒ Object



81
82
83
84
85
86
# File 'lib/rspec/core/dsl.rb', line 81

def self.expose_example_group_alias_globally(method_name)
  change_global_dsl do
    remove_method(method_name) if method_defined?(method_name)
    define_method(method_name) { |*a, &b| ::RSpec.__send__(method_name, *a, &b) }
  end
end

.expose_globally!Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Adds the describe method to Module and the top level binding.



58
59
60
61
62
63
64
65
66
# File 'lib/rspec/core/dsl.rb', line 58

def self.expose_globally!
  return if exposed_globally?

  example_group_aliases.each do |method_name|
    expose_example_group_alias_globally(method_name)
  end

  @exposed_globally = true
end

.exposed_globally?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/rspec/core/dsl.rb', line 32

def self.exposed_globally?
  @exposed_globally ||= false
end

.remove_globally!Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Removes the describe method from Module and the top level binding.



70
71
72
73
74
75
76
77
78
# File 'lib/rspec/core/dsl.rb', line 70

def self.remove_globally!
  return unless exposed_globally?

  example_group_aliases.each do |method_name|
    change_global_dsl { undef_method method_name }
  end

  @exposed_globally = false
end