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)

Instance Method Details

- (Object) chain(name, &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.

Examples:


RSpec::Matchers.define :have_errors_on do |key|
  chain :with do |message|
    @message = message
  end
  match do |actual|
    actual.errors[key] == @message
  end
end
expect(minor).to have_errors_on(:age).with("Not old enough to participate")
181
182
183
184
185
186
187
# File 'lib/rspec/matchers/dsl.rb', line 181
def chain(name, &definition)
  define_user_override(name, definition) do |*args, &block|
    super(*args, &block)
    @chained_method_clauses.push([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.

Examples:


RSpec::Matchers.define :qualify_for do |expected|
  match { your_match_logic }
  description do
    "qualify for #{expected}"
  end
end

Yields:

  • (Object)

    actual the actual object (i.e. the value wrapped by expect)

142
143
144
# File 'lib/rspec/matchers/dsl.rb', line 142
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.

148
149
150
# File 'lib/rspec/matchers/dsl.rb', line 148
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.

Examples:


RSpec::Matchers.define :have_strength do |expected|
  match { your_match_logic }
  failure_message do |actual|
    "Expected strength of #{expected}, but had #{actual.strength}"
  end
end

Yields:

  • (Object)

    actual the actual object (i.e. the value wrapped by expect)

105
106
107
# File 'lib/rspec/matchers/dsl.rb', line 105
def failure_message(&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.

Examples:


RSpec::Matchers.define :have_strength do |expected|
  match { your_match_logic }
  failure_message_when_negated do |actual|
    "Expected not to have strength of #{expected}, but did"
  end
end

Yields:

  • (Object)

    actual the actual object (i.e. the value wrapped by expect)

124
125
126
# File 'lib/rspec/matchers/dsl.rb', line 124
def failure_message_when_negated(&definition)
  define_user_override(__method__, definition)
end

- (Object) match {|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.

Examples:


RSpec::Matchers.define :be_even do
  match do |actual|
    actual.even?
  end
end
expect(4).to be_even     # passes
expect(3).not_to be_even # passes
expect(3).to be_even     # fails
expect(4).not_to be_even # fails

Yields:

  • (Object)

    actual the actual value (i.e. the value wrapped by expect)

39
40
41
42
43
44
45
46
47
48
# File 'lib/rspec/matchers/dsl.rb', line 39
def match(&match_block)
  define_user_override(:matches?, match_block) do |actual|
    begin
      @actual = actual
      super(*actual_arg_for(match_block))
    rescue RSpec::Expectations::ExpectationNotMetError
      false
    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.

Examples:


RSpec::Matchers.define :accept_as_valid do |candidate_address|
  match_unless_raises ValidationException do |validator|
    validator.validate(candidate_address)
  end
end
expect(email_validator).to accept_as_valid("person@company.com")

Yields:

  • (Object)

    actual the actual object (i.e. the value wrapped by expect)

77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/rspec/matchers/dsl.rb', line 77
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.

Yields:

  • (Object)

    actual the actual value (i.e. the value wrapped by expect)

56
57
58
59
60
61
# File 'lib/rspec/matchers/dsl.rb', line 56
def match_when_negated(&match_block)
  define_user_override(:does_not_match?, match_block) do |actual|
    @actual = actual
    super(*actual_arg_for(match_block))
  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).

156
157
158
# File 'lib/rspec/matchers/dsl.rb', line 156
def supports_block_expectations
  define_method(:supports_block_expectations?) { true }
end