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
Instance Method Summary collapse
-
#chain(method_name, *attr_names, &definition) ⇒ Object
Convenience for defining methods on this matcher to create a fluent interface.
-
#description {|Object| ... } ⇒ Object
Customize the description to use for one-liners.
-
#diffable ⇒ Object
Tells the matcher to diff the actual and expected values in the failure message.
-
#failure_message {|Object| ... } ⇒ Object
Customizes the failure message to use when this matcher is asked to positively match.
-
#failure_message_when_negated {|Object| ... } ⇒ Object
Customize the failure message to use when this matcher is asked to negatively match.
-
#match(options = {}) {|Object| ... } ⇒ Object
Stores the block that is used to determine whether this matcher passes or fails.
-
#match_unless_raises(expected_exception = Exception) {|Object| ... } ⇒ Object
Use this instead of
match
when the block will raise an exception rather than returning false to indicate a failure. -
#match_when_negated(options = {}) {|Object| ... } ⇒ Object
Use this to define the block for a negative expectation (
expect(...).not_to
) when the positive and negative forms require different handling. -
#supports_block_expectations ⇒ Object
Declares that the matcher can be used in a block expectation.
Instance Method Details
#chain(method_name, *attr_names, &definition) ⇒ Object
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.
298 299 300 301 302 303 304 305 306 307 308 309 310 |
# File 'lib/rspec/matchers/dsl.rb', line 298 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 |
#description {|Object| ... } ⇒ Object
Customize the description to use for one-liners. Only use this when the description generated by default doesn’t suit your needs.
253 254 255 |
# File 'lib/rspec/matchers/dsl.rb', line 253 def description(&definition) define_user_override(__method__, definition) end |
#diffable ⇒ Object
Tells the matcher to diff the actual and expected values in the failure message.
259 260 261 |
# File 'lib/rspec/matchers/dsl.rb', line 259 def diffable define_method(:diffable?) { true } end |
#failure_message {|Object| ... } ⇒ Object
Customizes the failure message to use when this matcher is asked to positively match. Only use this when the message generated by default doesn’t suit your needs.
216 217 218 |
# File 'lib/rspec/matchers/dsl.rb', line 216 def (&definition) define_user_override(__method__, definition) end |
#failure_message_when_negated {|Object| ... } ⇒ Object
Customize the failure message to use when this matcher is asked to negatively match. Only use this when the message generated by default doesn’t suit your needs.
235 236 237 |
# File 'lib/rspec/matchers/dsl.rb', line 235 def (&definition) define_user_override(__method__, definition) end |
#match(options = {}) {|Object| ... } ⇒ 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 wish to allow these to bubble up, pass in the option :notify_expectation_failures => true
.
131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/rspec/matchers/dsl.rb', line 131 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 |
#match_unless_raises(expected_exception = Exception) {|Object| ... } ⇒ Object
Use this instead of match
when the block will raise an exception rather than returning false to indicate a failure.
188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/rspec/matchers/dsl.rb', line 188 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 |
#match_when_negated(options = {}) {|Object| ... } ⇒ 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.
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 wish to allow these to bubble up, pass in the option :notify_expectation_failures => true
.
160 161 162 163 164 165 166 167 168 169 170 171 172 |
# File 'lib/rspec/matchers/dsl.rb', line 160 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 raise if [:notify_expectation_failures] false end end end |
#supports_block_expectations ⇒ Object
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
).
267 268 269 |
# File 'lib/rspec/matchers/dsl.rb', line 267 def supports_block_expectations define_method(:supports_block_expectations?) { true } end |