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.

Dave Schweisguth
  • 36,475
  • 10
  • 98
  • 121
Luiz E.
  • 6,769
  • 10
  • 58
  • 98
  • 1
    possible duplicate of [rspec failing error: expected false to respond to \`false?\`](http://stackoverflow.com/questions/23937758/rspec-failing-error-expected-false-to-respond-to-false) – Dave Schweisguth Jun 06 '14 at 13:15

2 Answers2

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)

Santhosh
  • 28,097
  • 9
  • 82
  • 87
  • 36
    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: https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers – Larry Kyrala Jun 12 '14 at 18:37
  • 1
    @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) – Santhosh Jun 13 '14 at 06:07
  • 1
    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](https://github.com/rspec/rspec-expectations/commit/860ca42905582549768ee0ff0837fb6c523b8199). – Larry Kyrala Jun 14 '14 at 14:17
  • 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. – moeabdol Aug 29 '15 at 03:54
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
sergeych
  • 791
  • 7
  • 11
  • 4
    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/'` – jonleighton Jan 26 '15 at 10:05