Posted 13 days ago. Visible to the public.

RSpec: ". not_to include" behaves like ".to exclude"

RSpec is smart when using the include-matcher in combination with .not_to. One could assume that

Copy
.not_to include(3, 4, 5)

evaluates to:

Copy
NOT( .to include(3, 4, 5) )

However, it behaves like:

Copy
.to (NOT include(3) && NOT include(4) && NOT include(5) )

Warning

Using .not_to in combination with the include-matcher doesn't logically negate the final truth value. It instead negates the individual include-expectations for each argument.

Proof

Copy
describe 'RSpec' do it "doesn't use logical negation for include, exhibit A" do expect([1, 2, 3]).to include(3, 4, 5) end it "doesn't use logical negation for include, exhibit B" do expect([1, 2, 3]).not_to include(3, 4, 5) end end

Exhibit A fails with:

Copy
expected [1, 2, 3] to include 4 and 5

Exhibit B fails with:

Copy
expected [1, 2, 3] not to include 3

Applications

Tip

This can be used to test for exclusion of multiple values all at once.

Growing Rails Applications in Practice
Check out our new e-book:
Learn to structure large Ruby on Rails codebases with the tools you already know and love.

Owner of this card:

Avatar
Klaus Weidinger
Last edit:
13 days ago
by Klaus Weidinger
About this deck:
We are makandra and do test-driven, agile Ruby on Rails software development.
License for source code
Posted by Klaus Weidinger to makandra dev
This website uses short-lived cookies to improve usability.
Accept or learn more