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


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

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

````ruby
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のドキュメントを読んでみました。

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?](https://groups.google.com/forum/#!topic/rspec/UmNMWV4ZWP0)

> 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](https://twitter.com/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

### おまけ
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">RSpecを長年使い続けた結果、僕は&quot;to_not&quot;の方が好き、という結論に至った。理由は最後の4文字を足したり引いたりするだけで条件を変えられるから。<br>Vimの&quot;shift-e&quot;で単語の末尾に移動、&quot;a&quot;でインサートモード、&quot;_not&quot;と入力。&quot;to_not&quot;はこれがやりやすい。<a href="https://t.co/4W3j9J3Zyw">https://t.co/4W3j9J3Zyw</a> <a href="https://t.co/HpH9no3Ews">pic.twitter.com/HpH9no3Ews</a></p>&mdash; Junichi Ito (伊藤淳一) (@jnchito) <a href="https://twitter.com/jnchito/status/1096909378752376833?ref_src=twsrc%5Etfw">February 16, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### あわせて読みたい

僕が書いたRSpec関連のQiita記事 + 翻訳した電子書籍です。
こちらも良かったらどうぞ。

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

- [RSpecの入門とその一歩先へ ～RSpec 3バージョン～](http://qiita.com/jnchito/items/624f6d5023c279046a1c)
- [RSpecの入門とその一歩先へ、第2イテレーション ～RSpec 3バージョン～](http://qiita.com/jnchito/items/47f539ddca7dbc01acef)
- [RSpecの入門とその一歩先へ、第3イテレーション ～RSpec 3バージョン～](http://qiita.com/jnchito/items/b1215a5d548cac4c7de6)

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

- [今日から使える！RSpec 3で追加された8つの新機能](http://qiita.com/jnchito/items/a4a51852c2c678b57868)

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

- [既存のRailsプロジェクトをRSpec 3.0にアップグレードする際の注意点 ～RSpec 3は怖くないよ！～](http://qiita.com/jnchito/items/f86b57d27b44e6e7d1e9)

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

- [Everyday Rails - RSpecによるRailsテスト入門 (電子書籍)](https://leanpub.com/everydayrailsrspec-jp)

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

- [モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう](http://qiita.com/jnchito/items/459d58ba652bf4763820)