be(true) と be_truthy は違います
はじめに
これまで RSpec を書くときには be_truthy / be_falsey をカジュアルに使ってました。なんというか RSpec っぽい書き方なのかな〜と思ってたんですよね。
ただ、ふとしたときに truthy は「trueっぽい」という意味だと知りました…!
「ん? trueっぽい!?」と気になって調べてみました。
「trueっぽいこと」を検証したいならOK
be_truthy は false と nil 以外であることを検証します。Rubyでは false と nil 以外はすべて真として扱われる言語仕様のため、です。
(反対に be_falsey は false もしくは nil であることを検証します)
テストで書くとこんな感じ。(上2つだけが truthy ではない)
it do
aggregate_failures do
expect(nil).to be_falsey
expect(false).to be_falsey
expect(true).to be_truthy
expect([]).to be_truthy
expect('').to be_truthy
expect(1).to be_truthy
expect('aaa').to be_truthy
end
end
ただ、ちょっと考えてみたんですが、 be_truthy を使いたくなるケースってあまりなさそうな。。
Railsであれば be_present や be_nil で事足りそうだし、その方がわかりやすいのでは、と。
「trueであること」を検証したいときは
やりたいのは多くの場合こっちではないでしょうか。
trueっぽい、みたいな曖昧なことではなく、booleanを判定したいことは多いでしょう。この場合は be(true) を使うべきです。
例えば、このようなメソッドです。
def valid?
# true or false
end
このようなメソッドでは、boolean が返ってくることを期待しているので、 be_truthy ではなく be(true) を使った方が厳密な検証になります。
なお、eq(true) でもほぼ同じだけど、eq だと値が同一かどうか、be だとオブジェクトが同一かどうかという違いがあるみたいです。
おわりに
trueであることを検証したいときに、盲目的に be_truthy を使っちゃってました。反省。
これからは be(true) を使うようにします!
Discussion