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.