RSpec: Scoping custom matchers to example groups

Updated . Posted . Visible to the public. Repeats.

When you find yourself in the situation that you would like to define a custom matcher in your specs, but you do not want to define a global matcher since you need it only for your specific test, there are two ways to do it:

Custom matcher for a single group

If you're only going to include a matcher once, you can also use the matcher macro within an example group Show archive.org snapshot :

describe "group" do
  
  matcher :be_just_like do |expected|
    match {|actual| actual == expected}
  end

  it "has access to the defined matcher" do
    5.should be_just_like(5)
  end
end

Tip

You can composing a custom matcher from existing matchers to quickly name a group of expectations.

Custom matcher for some groups

If you are planning to re-use a matcher in multiple groups, put it in a module and include it only where you need it.

Since each describe block generates an anonymous class internally, this will include the matcher for this example group only.

require 'rspec/expectations'

module MyHelpers
  extend RSpec::Matchers::DSL

  matcher :be_just_like do |expected|
    match {|actual| actual == expected}
  end
end

describe "group with MyHelpers" do
  include MyHelpers
  it "has access to the defined matcher" do
    5.should be_just_like(5)
  end
end

describe "group without MyHelpers" do
  it "does not have access to the defined matcher" do
    expect do
      5.should be_just_like(5)
    end.to raise_exception
  end
end
Last edit
Henning Koch
Keywords
local, localize, inline, limit, define, only
License
Source code in this card is licensed under the MIT License.
Posted to makandra dev (2016-06-05 17:52)