Class: RSpec::Core::Example
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
RSpec::Core::SuiteHookContext
|
|
Inherits: | Object |
Defined in: | rspec-core/lib/rspec/core/example.rb |
Overview
Example
blocks are evaluated in the context of an instance of an ExampleGroup
, not in the context of an instance of Example
.
Wrapper for an instance of a subclass of ExampleGroup
. An instance of Example
is returned by example definition methods such as it and is yielded to the it, before, after, around, let and subject blocks.
This allows us to provide rich metadata about each individual example without adding tons of methods directly to the ExampleGroup
that users may inadvertently redefine.
Useful for configuring logging and/or taking some action based on the state of an example’s metadata.
Constant Summary
-
AllExceptionsExcludingDangerousOnesOnRubiesThatAllowIt =
Internal use only
:nocov: For some reason, rescuing
::RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
in place ofException
above can cause the exit status to be the wrong thing. I have no idea why. See: github.com/rspec/rspec-core/pull/2063#discussion_r38284978Support::AllExceptionsExceptOnesWeMustNotRescue
Class Method Summary
-
.delegate_to_metadata(key)
Internal use only
Internal use only
Used to define methods that delegate to this example’s metadata.
-
.new(example_group_class, description, user_metadata, example_block = nil) ⇒ Example
constructor
Internal use only
Internal use only
Creates a new instance of
Example
. - .parse_id(id) Internal use only Internal use only
Instance Attribute Summary
- #clock rw Internal use only Internal use only
-
#display_exception
rw
Internal use only
Internal use only
The exception that will be displayed to the user – either the failure of the example or the
pending_exception
if the example is pending. -
#display_exception=(ex)
rw
Internal use only
Internal use only
Assigns the exception that will be displayed to the user – either the failure of the example or the
pending_exception
if the example is pending. -
#example_group_instance
readonly
Internal use only
Internal use only
Returns the example_group_instance that provides the context for running this example.
-
#exception
readonly
Returns the first exception raised in the context of running this example (nil if no exception is raised).
-
#metadata
readonly
Returns the metadata object associated with this example.
- #pending ⇒ Boolean readonly
- #pending? ⇒ Boolean readonly
- #reporter ⇒ RSpec::Core::Reporter readonly
- #skipped? ⇒ Boolean readonly
- #mocks_need_verification? ⇒ Boolean readonly private
Instance Method Summary
-
#description
Returns the string submitted to
example
or its aliases (e.g.specify
,it
, etc). -
#duplicate_with(metadata_overrides = {}) ⇒ Example
Duplicates the example and overrides metadata with the provided hash.
-
#example_group
Returns the example group class that provides the context for running this example.
- #execution_result ⇒ ExecutionResult
-
#fail_with_exception(reporter, exception)
Internal use only
Internal use only
Used internally to set an exception and fail without actually executing the example when an exception is raised in before(:context).
- #file_path ⇒ String
- #full_description ⇒ String
- #id ⇒ String
-
#inspect
(also: #to_s)
Provide a human-readable representation of this class.
-
#inspect_output
Returns a description of the example that always includes the location.
- #instance_exec(*args, &block) Internal use only Internal use only
- #location ⇒ String
-
#location_rerun_argument
Returns the location-based argument that can be passed to the
rspec
command to rerun this example. -
#rerun_argument
deprecated
Deprecated.
Use #location_rerun_argument instead.
-
#run(example_group_instance, reporter)
Internal use only
Internal use only
instance_execs the block passed to the constructor in the context of the instance of
ExampleGroup
. -
#set_aggregate_failures_exception(exception)
Internal use only
Internal use only
Used to set the exception when
aggregate_failures
fails. -
#set_exception(exception)
Internal use only
Internal use only
Used internally to set an exception in an after hook, which captures the exception but doesn’t raise it.
- #skip ⇒ Boolean
-
#skip_with_exception(reporter, exception)
Internal use only
Internal use only
Used internally to skip without actually executing the example when skip is used in before(:context).
-
#to_s
Alias for #inspect.
- #update_inherited_metadata(updates) Internal use only Internal use only
- #assign_generated_description private
- #finish(reporter) private
- #generate_description private
- #hooks private
- #location_description private
- #record_finished(status, reporter) private
- #run_after_example private
- #run_before_example private
- #start(reporter) private
- #verify_mocks private
- #with_around_and_singleton_context_hooks private
- #with_around_example_hooks private
Class Method Details
.delegate_to_metadata(key)
Used to define methods that delegate to this example’s metadata.
# File 'rspec-core/lib/rspec/core/example.rb', line 48
def self. (key) define_method(key) { @metadata[key] } end
.parse_id(id)
Instance Attribute Details
#clock (rw)
# File 'rspec-core/lib/rspec/core/example.rb', line 174
attr_accessor :clock
#display_exception (rw)
The exception that will be displayed to the user – either the failure of the example or the pending_exception
if the example is pending.
# File 'rspec-core/lib/rspec/core/example.rb', line 388
def display_exception @exception || execution_result.pending_exception end
#display_exception=(ex) (rw)
Assigns the exception that will be displayed to the user – either the failure of the example or the pending_exception
if the example is pending.
# File 'rspec-core/lib/rspec/core/example.rb', line 396
def display_exception=(ex) if pending? && !(Pending::PendingExampleFixedError === ex) @exception = nil execution_result.pending_fixed = false execution_result.pending_exception = ex else @exception = ex end end
#example_group_instance (readonly)
Returns the example_group_instance that provides the context for running this example.
# File 'rspec-core/lib/rspec/core/example.rb', line 170
attr_reader :example_group_instance
#exception (readonly)
Returns the first exception raised in the context of running this example (nil if no exception is raised).
# File 'rspec-core/lib/rspec/core/example.rb', line 158
attr_reader :exception
#metadata (readonly)
Returns the metadata object associated with this example.
# File 'rspec-core/lib/rspec/core/example.rb', line 163
attr_reader :
#mocks_need_verification? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'rspec-core/lib/rspec/core/example.rb', line 530
def mocks_need_verification? exception.nil? || execution_result.pending_fixed? end
#pending ⇒ Boolean
(readonly)
# File 'rspec-core/lib/rspec/core/example.rb', line 66
:pending
#pending? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'rspec-core/lib/rspec/core/example.rb', line 234
def pending? !!pending end
#reporter ⇒ RSpec::Core::Reporter (readonly)
# File 'rspec-core/lib/rspec/core/example.rb', line 226
attr_reader :reporter
#skipped? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'rspec-core/lib/rspec/core/example.rb', line 238
def skipped? !!skip end
Instance Method Details
#assign_generated_description (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 534
def assign_generated_description if [:description].empty? && (description = generate_description) [:description] = description [:full_description] += description end ensure RSpec::Matchers.clear_generated_description end
#description
Returns the string submitted to example
or its aliases (e.g. specify
, it
, etc). If no string is submitted (e.g. ‘it { is_expected.to do_something }`) it returns the message generated by the matcher if there is one, otherwise returns a message including the location of the example.
# File 'rspec-core/lib/rspec/core/example.rb', line 76
def description description = if [:description].to_s.empty? location_description else [:description] end RSpec.configuration.format_docstrings_block.call(description) end
#duplicate_with(metadata_overrides = {}) ⇒ Example
Duplicates the example and overrides metadata with the provided hash.
# File 'rspec-core/lib/rspec/core/example.rb', line 132
def duplicate_with(={}) = .clone.merge( ) RSpec::Core::Metadata::RESERVED_KEYS.each do |reserved_key| .delete reserved_key end # don't clone the example group because the new example # must belong to the same example group (not a clone). # # block is nil in new_metadata so we have to get it from metadata. Example.new(example_group, description.clone, , [:block]) end
#example_group
Returns the example group class that provides the context for running this example.
# File 'rspec-core/lib/rspec/core/example.rb', line 230
def example_group @example_group_class end
#execution_result ⇒ ExecutionResult
# File 'rspec-core/lib/rspec/core/example.rb', line 53
:execution_result
#fail_with_exception(reporter, exception)
Used internally to set an exception and fail without actually executing the example when an exception is raised in before(:context).
#file_path ⇒ String
# File 'rspec-core/lib/rspec/core/example.rb', line 56
:file_path
#finish(reporter) (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 478
def finish(reporter) = execution_result. if @exception execution_result.exception = @exception record_finished :failed, reporter reporter.example_failed self false elsif execution_result. = record_finished :pending, reporter reporter.example_pending self true else record_finished :passed, reporter reporter.example_passed self true end end
#full_description ⇒ String
# File 'rspec-core/lib/rspec/core/example.rb', line 59
:full_description
#generate_description (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 543
def generate_description RSpec::Matchers.generated_description rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e location_description + " (Got an error when generating description " \ "from matcher: #{e.class}: #{e.} -- #{e.backtrace.first})" end
#hooks (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 462
def hooks example_group_instance.singleton_class.hooks end
#id ⇒ String
#inspect Also known as: #to_s
Provide a human-readable representation of this class
# File 'rspec-core/lib/rspec/core/example.rb', line 220
def inspect "#<#{self.class.name} #{description.inspect}>" end
#inspect_output
Returns a description of the example that always includes the location.
# File 'rspec-core/lib/rspec/core/example.rb', line 87
def inspect_output inspect_output = "\"#{description}\"" unless [:description].to_s.empty? inspect_output += " (#{location})" end inspect_output end
#instance_exec(*args, &block)
# File 'rspec-core/lib/rspec/core/example.rb', line 456
def instance_exec(*args, &block) @example_group_instance.instance_exec(*args, &block) end
#location ⇒ String
# File 'rspec-core/lib/rspec/core/example.rb', line 62
:location
#location_description (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 550
def location_description "example at #{location}" end
#location_rerun_argument
Returns the location-based argument that can be passed to the rspec
command to rerun this example.
# File 'rspec-core/lib/rspec/core/example.rb', line 96
def location_rerun_argument @location_rerun_argument ||= begin loaded_spec_files = RSpec.configuration.loaded_spec_files Metadata.ascending( ) do || return [:location] if loaded_spec_files.include?( [:absolute_file_path]) end end end
#record_finished(status, reporter) (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 498
def record_finished(status, reporter) execution_result.record_finished(status, clock.now) reporter.example_finished(self) end
#rerun_argument
Use #location_rerun_argument instead.
If there are multiple examples identified by this location, they will use #id to rerun instead, but this method will still return the location (that’s why it is deprecated!).
Returns the location-based argument that can be passed to the rspec
command to rerun this example.
# File 'rspec-core/lib/rspec/core/example.rb', line 111
def rerun_argument location_rerun_argument end
#run(example_group_instance, reporter)
instance_execs the block passed to the constructor in the context of the instance of ExampleGroup
.
# File 'rspec-core/lib/rspec/core/example.rb', line 246
def run(example_group_instance, reporter) @example_group_instance = example_group_instance @reporter = reporter RSpec.configuration.configure_example(self, hooks) RSpec.current_example = self start(reporter) Pending.mark_pending!(self, pending) if pending? begin if skipped? Pending.mark_pending! self, skip elsif !RSpec.configuration.dry_run? with_around_and_singleton_context_hooks do begin run_before_example RSpec.current_scope = :example @example_group_instance.instance_exec(self, &@example_block) if pending? Pending.mark_fixed! self raise Pending::PendingExampleFixedError, 'Expected example to fail since it is pending, but it passed.', [location] end rescue Pending::SkipDeclaredInExample => _ # The "=> _" is normally useless but on JRuby it is a workaround # for a bug that prevents us from getting backtraces: # https://github.com/jruby/jruby/issues/4467 # # no-op, required metadata has already been set by the `skip` # method. rescue AllExceptionsExcludingDangerousOnesOnRubiesThatAllowIt => e set_exception(e) ensure RSpec.current_scope = :after_example_hook run_after_example end end end rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e set_exception(e) ensure @example_group_instance = nil # if you love something... let it go end finish(reporter) ensure execution_result.ensure_timing_set(clock) RSpec.current_example = nil end
#run_after_example (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 516
def run_after_example assign_generated_description if defined?(::RSpec::Matchers) hooks.run(:after, :example, self) verify_mocks ensure @example_group_instance.teardown_mocks_for_rspec end
#run_before_example (private)
[ GitHub ]#set_aggregate_failures_exception(exception)
Used to set the exception when aggregate_failures
fails.
# File 'rspec-core/lib/rspec/core/example.rb', line 425
def set_aggregate_failures_exception(exception) return set_exception(exception) unless display_exception exception = RSpec::Core::MultipleExceptionError::InterfaceTag.for(exception) exception.add display_exception self.display_exception = exception end
#set_exception(exception)
Used internally to set an exception in an after hook, which captures the exception but doesn’t raise it.
# File 'rspec-core/lib/rspec/core/example.rb', line 412
def set_exception(exception) return self.display_exception = exception unless display_exception unless RSpec::Core::MultipleExceptionError === display_exception self.display_exception = RSpec::Core::MultipleExceptionError.new(display_exception) end display_exception.add exception end
#skip ⇒ Boolean
# File 'rspec-core/lib/rspec/core/example.rb', line 69
:skip
#skip_with_exception(reporter, exception)
Used internally to skip without actually executing the example when skip is used in before(:context).
#start(reporter) (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 473
def start(reporter) reporter.example_started(self) execution_result.started_at = clock.now end
#to_s
Alias for #inspect.
# File 'rspec-core/lib/rspec/core/example.rb', line 223
alias to_s inspect
#update_inherited_metadata(updates)
# File 'rspec-core/lib/rspec/core/example.rb', line 148
def (updates) .update(updates) do |_key, existing_example_value, _new_inherited_value| existing_example_value end end
#verify_mocks (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 524
def verify_mocks @example_group_instance.verify_mocks_for_rspec if mocks_need_verification? rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e set_exception(e) end
#with_around_and_singleton_context_hooks (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 508
def with_around_and_singleton_context_hooks singleton_context_hooks_host = example_group_instance.singleton_class singleton_context_hooks_host.run_before_context_hooks(example_group_instance) with_around_example_hooks { yield } ensure singleton_context_hooks_host.run_after_context_hooks(example_group_instance) end
#with_around_example_hooks (private)
[ GitHub ]# File 'rspec-core/lib/rspec/core/example.rb', line 466
def with_around_example_hooks RSpec.current_scope = :before_example_hook hooks.run(:around, :example, self) { yield } rescue Support::AllExceptionsExceptOnesWeMustNotRescue => e set_exception(e) end