変化の経緯がなるほどなーと思ったのでまとめる。
出典
解説
RSpec3のリリースノートいわく
RSpec 2 had a pair of matchers (be_true and be_false) that mirror Ruby's conditional semantics: be_true would pass for any value besides nil or false, and be_false would pass for nil or false. In RSpec 3, we've renamed these to be_truthy and be_falsey (or be_falsy, if you prefer that spelling) to make their semantics more explicit and to reduce confusion with be true/be false (which read the same as be_true/be_false but only pass when given exact true/false values).
和訳すると
RSpec 2には、Rubyの条件付きセマンティクスを反映するマッチャーのペア(be_trueとbe_false)がありました。be_trueはnilまたはfalse以外の値を渡し、be_falseはnilまたはfalseを渡します。 RSpec 3では、これらの名前をbe_truthyとbe_falsey(またはそのスペルが望ましい場合はbe_falsy)に名前を変更して、セマンティクスをより明確にし、be true / be falseとの混同を減らします(be_true / be_falseと同じように読み取りますが、正確なtrue / false値が与えられたときに渡します)。
和訳だけだとわかりづらいかもしれませんが、意図を汲み取ると以下の通り
- RSpec2までは
be_true
は 「nilかfalse以外の値のとき」be_false
は 「nilまたはfalseのとき」というマッチャになっていた。 - 上記の場合、be trueという「trueと同一である」という名前に反してtrueと合致しないものも判定していた
- そのためRSpec3では挙動に合わせてマッチャ名を変更し
be_truthy
とbe_falsey/be_falsy
にリネームを行った
もし本来の意味のbe true、つまり「trueと同一である」というのを調べたい場合は be
マッチャでtrueか同一か調べればいいということになる。
expect(check_value).to be(true)
なお be(true)
ではなく be
だけにすると be_truthy
と同じ挙動になるので気をつけること
余談
PHPは両方あるので紛らわしい(参考:いつから俺は、be_truthy/be_falseyの仕様を勘違いしていたのだ - type holyshared = Engineer