rspec-2.11 がリリースされましたね。いくつかの変更点の中に、今後は should ではなく expect を推奨し、デフォルトでは expect のみが有効化されるようになる、というものがありました。
http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
個人的にこの変更は説得力に欠けるなーと思っていて、 expect 推しにする理由が
- should は Kernel にはえるので Kernel を include しない BasicObject のインスタンスに対して should を呼ぶとおかしくなる
- 標準ライブラリ delegate は Kernel のメソッドの一部だけを include するので rspec と delegate のどちらが先にロードされるかによって should の挙動がおかしくなる
なのだけど、ずいぶん限定された状況でのみ起こる問題で、この変更がもたらすインパクトの大きさに見合った理由かという点で疑問を感じます。*1
でもまあ、 should が使えなくなるわけではないし、ライブラリのアップデートで API が変わるのは珍しいことじゃないし、たとえ将来ぜんぶの spec を expect に書き換えなきゃいけなくなったとしてもその手間に十分見合うと思うし、そもそもオープンソースなのだから今からでも議論に参加して should の正当性を主張したり BasicObject や delegate の扱いに対するパッチを書いたりすればいい。*2そういう努力をせずに文句だけ言うのはダメだろ、という意見は正しいと思うし、なので RSpec に対して文句を言うつもりはありません。*3
でもね。これだけは言いたい。一部の TDD 信者みたいな人たち*4が、「RSpec は英語として自然に読み書きできる表現だから素晴らしいんだ!」みたいな主張でもって RSpec の優位性を喧伝してたと思いますが、あれはいったいなんだったんだ。彼らは expect 推しの件についてどう思ってるんですかね。 expect(foo).to be < 10
をみてもまだ「英語として自然」と主張できるのか。 Test::Unit オワコンみたいな雰囲気を出してたけども assert foo < 10
よりも読みやすいと、本当に本気でそう思うのか。
別に個人的に TDD 信者な人たちに恨みがあるわけではないし、論破したいわけでもないですが、少なくとも「RSpec は英語として自然に読み書きできる表現だから素晴らしいんだ!」という主張には説得力なかったよね、過剰に言い過ぎてたんじゃないの、ということは言っておきたい。だって should が英語表現として優れていてそれが RSpec の優位性だったのなら expect 推しに変更するはずがないので。それとも英語ネイティブにとっては should も expect も全く同じように読みやすいものなんでしょうか。そんなわけないと思うんだよなー、 should のほうが読みやすいって外国人も言ってるし。*5
要するに Rspec の開発者たちは英語としての読みやすさ書きやすさなんてものにはさほど入れ込んでいなくて、 TDD を広めたい一部の人たちが「ほら、 xUnit 系の assert_XXX よりも should be_XXX のほうがよっぽど自然な英語に近くて読みやすいでしょう?」などといってことさら強調しすぎたからおかしな広まり方をしたんじゃないの?それってコミュニティの欺瞞だったんじゃないの?っていう部分に、恨みはないけど憤りを感じずにはいられない。どんなコミュニティにもある話なんでしょうけど、一部の声の大きい人たちが言ってることが正しいってことになってしまって、実際は全然正しくもなんともないことがまかり通ってしまう、それ以外のやり方や考え方が異端扱いされて不当に貶められる、みたいな残念な例だったのかなー、と思います。振り回されるほうが悪い、と言われればそれまでですが。
TDD 信者の皆様の反論をお待ちしております :)
*1:同様のコメントをしている人がいた http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax#comment-558984276
*2:delegate に関しては ruby core のほうにパッチを投げてもいいのかもしれない
*3:rspec-mocks のほうは should_receive としか書けないようで、そのへんの統一感を崩してしまってる点でもやはり説得力に欠けるなーとは思う
*4:そういうコミュニティ全体のことであって、特定の個人の話ではないです
*5:http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax#comment-558583533