module RSpec::Core::SharedExampleGroup
def self.created_from_caller(other_caller)
def self.created_from_caller(other_caller) @caller_line == other_caller.last end
def self.included(kls)
def self.included(kls) kls.describe(&@shared_block) kls.children.first.metadata[:shared_group_name] = name end
def key? candidate
def key? candidate [String, Symbol, Module].any? { |cls| cls === candidate } end
def key_taken? key
def key_taken? key RSpec.world.shared_example_groups.has_key?(key) end
def raise_key_taken key
def raise_key_taken key raise ArgumentError, "Shared example group '#{key}' already exists" end
def raise_name_error
def raise_name_error raise NameError, "The first argument (#{name}) to share_as must be a legal name for a constant not already in use." end
def share_as(name, &block)
def share_as(name, &block) if Object.const_defined?(name) mod = Object.const_get(name) raise_name_error unless mod.created_from_caller(caller) end mod = Module.new do @shared_block = block @caller_line = caller.last def self.created_from_caller(other_caller) @caller_line == other_caller.last end def self.included(kls) kls.describe(&@shared_block) kls.children.first.metadata[:shared_group_name] = name end end shared_const = Object.const_set(name, mod) RSpec.world.shared_example_groups[shared_const] = block end
def shared_examples *args, &block
- See: ExampleGroup.include_context -
See: ExampleGroup.include_examples -
See: ExampleGroup.it_behaves_like -
Parameters:
-
block
() -- to be eval'd in a nested example group generated by `it_behaves_like`
-
name
(String
) -- to match when looking up this shared group
Overloads:
-
shared_examples(name, tags, &block)
-
shared_examples(name, &block)
def shared_examples *args, &block if key? args.first key = args.shift raise_key_taken key if key_taken? key RSpec.world.shared_example_groups[key] = block end unless args.empty? mod = Module.new (class << mod; self; end).send :define_method, :extended do |host| host.class_eval &block end RSpec.configuration.extend mod, *args end end