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
Share:
10,876
Luiz E.
Author by

Luiz E.

Updated on June 22, 2022

Comments

  • Luiz E.
    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 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.

  • Larry Kyrala
    Larry Kyrala almost 10 years
    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-matcher‌​s
  • Santhosh
    Santhosh almost 10 years
    @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)
  • Larry Kyrala
    Larry Kyrala almost 10 years
    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.
  • jonleighton
    jonleighton over 9 years
    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/'
  • moeabdol
    moeabdol over 8 years
    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 @Santhosh added a note to his answer explaining the subtle pitfall. This will help many avoid some serious misinterpretations.