Module: RSpec::Matchers::DSL::Macros
- Included in:
- Matcher
- Defined in:
- lib/rspec/matchers/dsl.rb
Overview
Contains the methods that are available from within the
RSpec::Matchers.define
DSL for creating custom matchers.
Defined Under Namespace
Modules: Deprecated
Constant Summary
Instance Method Summary (collapse)
-
- (Object) chain(method_name, *attr_names, &definition)
Convenience for defining methods on this matcher to create a fluent interface.
-
- (Object) description {|Object| ... }
Customize the description to use for one-liners.
-
- (Object) diffable
Tells the matcher to diff the actual and expected values in the failure message.
-
- (Object) failure_message {|Object| ... }
Customizes the failure messsage to use when this matcher is asked to positively match.
-
- (Object) failure_message_when_negated {|Object| ... }
Customize the failure messsage to use when this matcher is asked to negatively match.
-
- (Object) match(options = {}) {|Object| ... }
Stores the block that is used to determine whether this matcher passes or fails.
-
- (Object) match_unless_raises(expected_exception = Exception) {|Object| ... }
Use this instead of
match
when the block will raise an exception rather than returning false to indicate a failure. -
- (Object) match_when_negated {|Object| ... }
Use this to define the block for a negative expectation (
expect(...).not_to
) when the positive and negative forms require different handling. -
- (Object) supports_block_expectations
Declares that the matcher can be used in a block expectation.
Instance Method Details
- (Object) chain(method_name, *attr_names, &definition)
Convenience for defining methods on this matcher to create a fluent
interface. The trick about fluent interfaces is that each method must
return self in order to chain methods together. chain
handles that
for you. If the method is invoked and the
include_chain_clauses_in_custom_matcher_descriptions
config option
hash been enabled, the chained method name and args will be added to the
default description and failure message.
In the common case where you just want the chained method to store some
value(s) for later use (e.g. in match
), you can provide one or more
attribute names instead of a block; the chained method will store its
arguments in instance variables with those names, and the values will
be exposed via getters.
225 226 227 228 229 230 231 232 233 234 235 236 237 |
# File 'lib/rspec/matchers/dsl.rb', line 225 def chain(method_name, *attr_names, &definition) unless block_given? ^ attr_names.any? raise ArgumentError, "You must pass either a block or some attribute names (but not both) to `chain`." end definition = assign_attributes(attr_names) if attr_names.any? define_user_override(method_name, definition) do |*args, &block| super(*args, &block) @chained_method_clauses.push([method_name, args]) self end end |
- (Object) description {|Object| ... }
Customize the description to use for one-liners. Only use this when the description generated by default doesn't suit your needs.
180 181 182 |
# File 'lib/rspec/matchers/dsl.rb', line 180 def description(&definition) define_user_override(__method__, definition) end |
- (Object) diffable
Tells the matcher to diff the actual and expected values in the failure message.
186 187 188 |
# File 'lib/rspec/matchers/dsl.rb', line 186 def diffable define_method(:diffable?) { true } end |
- (Object) failure_message {|Object| ... }
Customizes the failure messsage to use when this matcher is asked to positively match. Only use this when the message generated by default doesn't suit your needs.
143 144 145 |
# File 'lib/rspec/matchers/dsl.rb', line 143 def (&definition) define_user_override(__method__, definition) end |
- (Object) failure_message_when_negated {|Object| ... }
Customize the failure messsage to use when this matcher is asked to negatively match. Only use this when the message generated by default doesn't suit your needs.
162 163 164 |
# File 'lib/rspec/matchers/dsl.rb', line 162 def (&definition) define_user_override(__method__, definition) end |
- (Object) match(options = {}) {|Object| ... }
Stores the block that is used to determine whether this matcher passes
or fails. The block should return a boolean value. When the matcher is
passed to expect(...).to
and the block returns true
, then the expectation
passes. Similarly, when the matcher is passed to expect(...).not_to
and the
block returns false
, then the expectation passes.
By default the match block will swallow expectation errors (e.g.
caused by using an expectation such as expect(1).to eq 2
), if you
with to allow these to bubble up, pass in the option
:notify_expectation_failures => true
.
65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/rspec/matchers/dsl.rb', line 65 def match(={}, &match_block) define_user_override(:matches?, match_block) do |actual| @actual = actual RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do begin super(*actual_arg_for(match_block)) rescue RSpec::Expectations::ExpectationNotMetError raise if [:notify_expectation_failures] false end end end end |
- (Object) match_unless_raises(expected_exception = Exception) {|Object| ... }
Use this instead of match
when the block will raise an exception
rather than returning false to indicate a failure.
115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/rspec/matchers/dsl.rb', line 115 def match_unless_raises(expected_exception=Exception, &match_block) define_user_override(:matches?, match_block) do |actual| @actual = actual begin super(*actual_arg_for(match_block)) rescue expected_exception => @rescued_exception false else true end end end |
- (Object) match_when_negated {|Object| ... }
Use this to define the block for a negative expectation (expect(...).not_to
)
when the positive and negative forms require different handling. This
is rarely necessary, but can be helpful, for example, when specifying
asynchronous processes that require different timeouts.
88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/rspec/matchers/dsl.rb', line 88 def match_when_negated(&match_block) define_user_override(:does_not_match?, match_block) do |actual| begin @actual = actual RSpec::Support.with_failure_notifier(RAISE_NOTIFIER) do super(*actual_arg_for(match_block)) end rescue RSpec::Expectations::ExpectationNotMetError false end end end |
- (Object) supports_block_expectations
Declares that the matcher can be used in a block expectation.
Users will not be able to use your matcher in a block
expectation without declaring this.
(e.g. expect { do_something }.to matcher
).
194 195 196 |
# File 'lib/rspec/matchers/dsl.rb', line 194 def supports_block_expectations define_method(:supports_block_expectations?) { true } end |