読者です 読者をやめる 読者になる 読者になる

RSpec3でのshouldについてメモ

RSpec

shoulda-matchers*1のExampleを見ていると、ワンライナーshouldで書いてあることが多くて、RSpec3だと原則shouldは使わないからどう書くんだろうと疑問に思っていたらshouldについて認識不足だったことが下記ページで分かった。qiita.com

expect記法が導入された経緯として、既存のshould記法はshould/should_receive/stubなどのメソッドをBasicObjectクラスにモンキーパッチで追加するため、delegate/proxyなオブジェクトで正常にテストができないという問題がありました。しかしワンライナーshouldはBasicObjectクラスにモンキーパッチされたものではなく、その実体はRSpec::Core::ExampleGroup#shouldであり、前述の問題は発生しません。そのためワンライナーshouldはこれまでexpect記法が用意されておらず、RSpec.configureでshould記法が無効化されていても利用することができました。

しかしコードの見た目上expect記法と混在させた時に一貫性がなかったり、「ワンライナーshouldのexpect記法は?」といったユーザからの声が多かったため、is_expected.toが代替記法として追加されます。

ちなみにモンキーパッチshouldはRSpec 3.0からdeprecated扱いになりますが(ただし明示的にshould記法を利用する宣言をすればdeprecation warningは表示されない)、ワンライナーshouldは3.0でも現役なため、is_expected.toが冗長だと感じる場合はワンライナーshouldを使い続けても問題ありません。

Ruby - RSpecの最新の動向・RSpec 3へのアップグレードガイド - Qiita#ワンライナーshouldのexpect記法

RSpec3はメジャーバージョンアップというだけあってRSpec2系からかなり変わっている部分がある。
日本語での情報だとこの辺りが網羅性あっていいかもしれない。
RSpec 3の重要な変更 - 有頂天Ruby

現状RSpec最新は3.2系なのでその辺の差分も把握しなきゃなあ。