expected true to respond to true?
Asked Answered
P

2

49

I upgraded my rspec-rails to 3.0.1 and now I'm seeing this error on all of my tests

 Failure/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.

Purgation answered 6/6, 2014 at 12:27 Comment(1)
possible duplicate of rspec failing error: expected false to respond to `false?`Dozier
A
96

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)

Alonso answered 6/6, 2014 at 12:37 Comment(4)
Technically this answer is incorrect. rspec 3.0 be_truthy is not the same as be true. If you truly want to check that the value is true and not just truthy, then you should use expect(true).to be true (note the lack of an underscore between be and true). Ref: relishapp.com/rspec/rspec-expectations/docs/built-in-matchersCustomhouse
@LarryKyrala. You are right about be true being not same as be_truthy. But my answer and the OP's question was about be_true (note the presence of an underscore)Alonso
You 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.Customhouse
The 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 @Alonso added a note to his answer explaining the subtle pitfall. This will help many avoid some serious misinterpretations.Hoodoo
C
1

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
Chaff answered 4/12, 2014 at 12:51 Comment(1)
It'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/'Keelung

© 2022 - 2024 — McMap. All rights reserved.