SakuraWi - BLog

みんなのウェディングのエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

【Ruby on Rails】be_falsyとbe_falseyとbe falseの違いについて【RSpec】


Ruby on RailsのテストをRSpecで書いているみなさん、どうも櫻井広大です。

be_falsy使っていますでしょうか。

タイトルにもある、

be_falsy

be_falsey

be false

の違いについて書きます!


  • RSpecでfalseやtrueの返り値のマッチャ be_falsy ということで、結論から書きますと、

be_falsybe_falsey は同じです。

be_falsybe false違います。

僕は完全にすべて同じものだと思っていました。

  • be_falsyとbe_falsey

これはエイリアスによって同様のふるまいをするようになっています。

完全に好みで使うことができます。

  • be_falsyと be falseの違い これらは明確に違います。

実際によくあるテストコードはこんな感じですよね

it { is_expected.to be false }

で、これは明確に意味が違います。

be_falsy は、falsenilの場合にマッチするのです。

rubyでいうところの、falsyな振る舞いをするもの、つまりfalseとnilなわけなのです。

if文などで評価される時にも、rubyはfalseとnilではif文の中のブロックは実行されません。

厳密にマッチさせるのであれば、be falseeq falseでマッチャを書く必要があります。

個人的には、be falseのように記述する方が厳密なテストになるのでこちらの方がいいかなーと思います。

特に、 false || nilなどのようなふるまいのテストを書く場合に、意図せぬ挙動になる場合があります。

nilが返ってほしい場合とfalseが返ってほしい場合、その違いはあるのでしっかりと自分が意図した内容のテストになっているのかは見定めましょう。