RSpec Custom Matchers
To make a custom matcher leveraging
Relish’s DSL,
in our spec/suppport/matchers folder, we create a new file named what the
matcher will do, like be_an_orange_button.rb
RSpec::Matchers.define(:be_an_orange_button) do |expected|
  match do |actual|
    actual[:class].include? "orange"
  end
  diffable
  failure_message do |actual|
    "expected #{actual} to be orange"
  end
  failure_message_when_negated do |actual|
    "expected #{actual} NOT to be orange"
  end
end
By using failure_message we override and customize the error message shown when we run
the spec.
diffable is also part of the DSL that Relish
provides
us and it will make the result look like
expected #<Capybara::Node::Element:0x00007f8541371d88> to be orange
   Diff:
   @@ -1 +1 @@
   -[]
   +#<Capybara::Node::Element tag="div" path="/HTML/BODY[1]/DIV[1]/DIV[2]/FORM (etc)
Instead of only failing like:
expected #<Capybara::Node::Element:0x00007f8541371d88> to be orange
It helps us see what went wrong, color coded in red and green as well in the terminal, if your supports it.
In our spec files, we can use it like:
expect(button).to be_an_orange_button
expect(button).not_to be_an_orange_button