Edited at

RSpecで「~ではないこと」を検証するときは expect(x).to_not 、または expect(x).not_to のどちらを使うべきか?


はじめに =「どっちがいいの?」

RSpecでは「~ではないこと」を検証するために、以下のような書き方ができます。

expect("spread").not_to include("red")

expect("spread").to_not include("red")

expect(true).not_to be_nil
expect(true).to_not be_nil

上の例で示したように、 to_notnot_to の2種類があり、どちらも同じように動きます。

「たぶんどっちでもいいんだろうけど、あえて決めるならどっちの方がいいんだろう?」ということが気になったので、ちょっと調べてみました。


リソース1. RSpecのドキュメント =「好きな方を使え」

まずRSpecのドキュメントを読んでみました。

https://www.relishapp.com/rspec/rspec-expectations/docs


expect(actual).not_to matcher(expected)

Note: You can also use expect(..).to_not instead of expect(..).not_to.

One is an alias to the other, so you can use whichever reads better to you.


"you can use whichever reads better to you."とあるので、「どちらでも好きな方を使って良い」と書いてあります。

どちらを推奨する、というような書き方はしていません。


リソース2. Myron Marston氏 =「どっちが正しいとか、どっちがオススメとか、気にしなくて良い」

この件についてネットを調べてみました。

すると、以下のようなGoogleグループのスレッドが見つかりました。

May expect { ... }.to_not be changed to expect { ... }.not_to?


Sergio Lapenna: So, what we should use? 'not_to' or 'to_not'?

Myron Marston: Use which ever you prefer. One is an alias for the other. In my experience, I've found that not_to reads more naturally sometimes, and to_not reads more naturally sometimes (for purely subjective reasons). My advice is to use whichever comes out naturally when you are writing your expectations and not worry about which is more "correct" or "recommended".


RSpecの作者であるMyron Marston氏が答えています。

要約すると「not_toが自然なときもあるし、to_notが自然なときもある。どっちが正しいとか、どっちがオススメとか、そういうことは気にしなくて良い」、ということみたいです。


リソース3. ネイティブの友人 =「どっちも一緒。(でも個人的には to_not の方が好き)」

最後に、僕の前職の同僚であるマイケル(@maikeruhorando)にFacebookメッセージで聞いてみました。

彼はイギリス出身のプログラマです。


僕: RSpecでto_notとnot_toっていう書き方があるんだけど、nativeが読むとどっちが自然なんでしょうか?

マイケル: どっちでも一緒かな。文法的にto_notのほうが正しいような気がしますけど、native speakerは両方使うので、どっちも自然です。んん、でもぼくはやっぱりto_notのほうが好きです。(個人的な好みだけですけど)


はい、僕は日本語で質問して、マイケルは流暢な日本語で答えてくれました。

マイケルすげー!(論点が違う)


結論 =「どっちでも良い!!!」

はい、というわけで、結論としては 「どっちでもOK」 ということでした。

Myron Marston氏が言うように、「not_toが自然なときもあるし、to_notが自然なときもある」のかもしれませんが、僕たち日本人がそのニュアンスを嗅ぎ分けるのはかなり難しいと思います。

なので、「どちらが正解か一概には決められない」ということでOKでしょう。

もし、あなたの周りで「not_toだ!」「いいえ、to_notよ!!」みたいな不毛な口論を交わしている同僚がいたら、そっとこの記事を差し出してやってくださいw


おまけ


あわせて読みたい

僕が書いたRSpec関連のQiita記事 + 翻訳した電子書籍です。

こちらも良かったらどうぞ。

RSpecの入門記事が読みたい方へ

RSpec 3の新機能が気になる方へ

RSpec 2からRSpec 3へアップグレードしたい方へ

RSpecでRailsのテストが書きたい方へ

今回の記事はRSpecというよりもむしろ英語の話だったので、英語関連のこのQiita記事もあわせて紹介しておきます。