class RSpec::Matchers::DSL::Matcher
The class used for custom matchers. The block passed to ‘RSpec::Matchers.define` will be evaluated in the context of the singleton class of an instance, and will have the {RSpec::Matchers::DSL::Macros Macros} methods available.
Attributes
Exposes the value being matched against – generally the object object wrapped by ‘expect`.
The block parameter used in the expectation
The name of the matcher.
Exposes the exception raised during the matching by ‘match_unless_raises`. Could be useful to extract details for a failure message.
Public Class Methods
@api private
# File lib/rspec/matchers/dsl.rb, line 461 def initialize(name, declarations, matcher_execution_context, *expected, &block_arg) @name = name @actual = nil @expected_as_array = expected @matcher_execution_context = matcher_execution_context @chained_method_clauses = [] @block_arg = block_arg klass = class << self # See `Macros#define_user_override` above, for an explanation. include(@user_method_defs = Module.new) self end RSpec::Support::WithKeywordsWhenNeeded.class_exec(klass, *expected, &declarations) end
Public Instance Methods
Provides the expected value. This will return an array if multiple arguments were passed to the matcher; otherwise it will return a single value. @see expected_as_array
# File lib/rspec/matchers/dsl.rb, line 481 def expected if expected_as_array.size == 1 expected_as_array[0] else expected_as_array end end
Adds the name (rather than a cryptic hex number) so we can identify an instance of the matcher in error messages (e.g. for ‘NoMethodError`)
# File lib/rspec/matchers/dsl.rb, line 498 def inspect "#<#{self.class.name} #{name}>" end
:nocov: Indicates that this matcher responds to messages from the ‘@matcher_execution_context` as well.
RSpec::Matchers#respond_to?
# File lib/rspec/matchers/dsl.rb, line 513 def respond_to?(method, include_private=false) super || @matcher_execution_context.respond_to?(method, include_private) end
Indicates that this matcher responds to messages from the ‘@matcher_execution_context` as well. Also, supports getting a method object for such methods.
RSpec::Matchers#respond_to_missing?
# File lib/rspec/matchers/dsl.rb, line 506 def respond_to_missing?(method, include_private=false) super || @matcher_execution_context.respond_to?(method, include_private) end
Private Instance Methods
# File lib/rspec/matchers/dsl.rb, line 521 def actual_arg_for(block) block.arity.zero? ? [] : [@actual] end
Takes care of forwarding unhandled messages to the ‘@matcher_execution_context` (typically the current running `RSpec::Core::Example`). This is needed by rspec-rails so that it can define matchers that wrap Rails’ test helper methods, but it’s also a useful feature in its own right.
RSpec::Matchers#method_missing
# File lib/rspec/matchers/dsl.rb, line 531 def method_missing(method, *args, &block) if @matcher_execution_context.respond_to?(method) @matcher_execution_context.__send__ method, *args, &block else super(method, *args, &block) end end