Matchers That Can Take Other Matchers
Posted on by Gentaro "hibariya" Terada
In RSpec, some matchers can take another matcher as an argument. It is sometimes useful for writing an expectation for a collection. Let’s say we want to test that an array contains a string that includes a particular text. We can do that by combining two matchers: include and match as follows.
expect(an_array).to include(match(/Lorem/))
# Of course we also could do:
# expect(an_array.grep(/Lorem/)).not_to be_empty
# or
# expect(an_array).to be_any {|item| /Lorem/ === item }
I think that in this case, the expectation with include and match is much more concise than the commented-out alternative ways above.
Other matchers like all and have_attributes also accept matchers as arguments.
expect(an_array).to all(be_a(String))
expect(person).to have_attributes(name: match(/Lorem/))