expected true to respond to true?
10,876
Solution 1
From rspec 3.0, be_true
is renamed to be_truthy
and be_false
to be_falsey
The behavior has not changed. So
(nil).should be_falsey
(false).should be_falsey
will pass, and
(anything other than nil or false).should be_truthy
will also pass
From the changelog 3.0.0.beta1 / 2013-11-07
Rename be_true and be_false to be_truthy and be_falsey. (Sam Phippen)
Solution 2
To not to rewrite lot of existing specs, you can add this to spec_helper (it harms my sense of harmony but saves time):
def true.true?
true
end
def true.false?
false
end
def false.true?
false
end
def false.false?
true
end
Author by
Luiz E.
Updated on June 22, 2022Comments
-
Luiz E. almost 2 years
I upgraded my
rspec-rails
to 3.0.1 and now I'm seeing this error on all of my testsFailure/Error: Sidekiq::Status::complete?(json.jid).should be_true expected true to respond to `true?`
I can't find the solution nor what I'm missing.
-
Larry Kyrala almost 10 yearsTechnically this answer is incorrect. rspec 3.0
be_truthy
is not the same asbe true
. If you truly want to check that the value is true and not just truthy, then you should useexpect(true).to be true
(note the lack of an underscore between be and true). Ref: relishapp.com/rspec/rspec-expectations/docs/built-in-matchers -
Santhosh almost 10 years@LarryKyrala. You are right about
be true
being not same asbe_truthy
. But my answer and the OP's question was aboutbe_true
(note the presence of an underscore) -
Larry Kyrala almost 10 yearsYou are correct sir! I'm sorry, I didn't see that rename mentioned anywhere in the 3.0 docs. But it is in the changelog.
-
jonleighton over 9 yearsIt's easy to find and replace this sort of thing. For example:
git grep -l be_true | xargs sed -i 's/be_true/be_truthy/'
-
moeabdol over 8 yearsThe direct answer to this question can be very misleading, and should be appended with a clear note as mentioned by LarryKyrala . It wouldn't hurt if @Santhosh added a note to his answer explaining the subtle pitfall. This will help many avoid some serious misinterpretations.