📚

be(true) と be_truthy は違います

に公開

はじめに

これまで RSpec を書くときには be_truthy / be_falsey をカジュアルに使ってました。なんというか RSpec っぽい書き方なのかな〜と思ってたんですよね。

ただ、ふとしたときに truthy は「trueっぽい」という意味だと知りました…!
「ん? trueっぽい!?」と気になって調べてみました。

「trueっぽいこと」を検証したいならOK

be_truthyfalsenil 以外であることを検証します。Rubyでは falsenil 以外はすべて真として扱われる言語仕様のため、です。
(反対に be_falseyfalse もしくは 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_presentbe_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