TIL: Define A Custom RSpec Matcher

04/13/20191 Min Read — In Testing, Ruby, Rails, TIL

You can define your own custom RSpec matchers. This is a great way to keep your spec tight and readable. A custom, domain-specific matcher can convey more intent in a single line than several lines of built-in matchers.

Here is a matcher to check if something is in a range:

require 'rspec/expectations'
RSpec::Matchers.define :be_betwen do |lower, upper|
match do |operand|
expect(operand).to be >= lower
expect(operand).to be <= upper
end
end
describe MyThing do
it "has a value between 0 and 10" do
thing = MyThing.new
expect(thing.value).to be_between(0, 10)
end
end

By requiring rspec/expectations we are able to define a matcher that takes 0 or more arguments (in our case, lower and upper) and then make assertions with them and the expect value.

source

Did you enjoy this post? Get emails from me with my latest posts by signing up for my newsletter.