はじめに =「どっちがいいの?」
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_not
と not_to
の2種類があり、どちらも同じように動きます。
「たぶんどっちでもいいんだろうけど、あえて決めるならどっちの方がいいんだろう?」ということが気になったので、ちょっと調べてみました。
リソース1. RSpecのドキュメント =「好きな方を使え」
まずRSpecのドキュメントを読んでみました。
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, andto_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を長年使い続けた結果、僕は"to_not"の方が好き、という結論に至った。理由は最後の4文字を足したり引いたりするだけで条件を変えられるから。
— Junichi Ito (伊藤淳一) (@jnchito) February 16, 2019
Vimの"shift-e"で単語の末尾に移動、"a"でインサートモード、"_not"と入力。"to_not"はこれがやりやすい。https://t.co/4W3j9J3Zyw pic.twitter.com/HpH9no3Ews
あわせて読みたい
僕が書いたRSpec関連のQiita記事 + 翻訳した電子書籍です。
こちらも良かったらどうぞ。
RSpecの入門記事が読みたい方へ
- RSpecの入門とその一歩先へ ~RSpec 3バージョン~
- RSpecの入門とその一歩先へ、第2イテレーション ~RSpec 3バージョン~
- RSpecの入門とその一歩先へ、第3イテレーション ~RSpec 3バージョン~
RSpec 3の新機能が気になる方へ
RSpec 2からRSpec 3へアップグレードしたい方へ
RSpecでRailsのテストが書きたい方へ
今回の記事はRSpecというよりもむしろ英語の話だったので、英語関連のこのQiita記事もあわせて紹介しておきます。