コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RSpec3でbe_trueとbe_falseはなくなり、be_truthyとbe_falsey(be_falsy)になった

変化の経緯がなるほどなーと思ったのでまとめる。

出典

Notable Changes in RSpec 3

解説

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_truthybe_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

参考リンク