ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

RSpecでshould使うのはもう古いらしい

Start with a simple example of behavior you expect from your system. Do this before you write any implementation code:
(だいだいの訳:それでは簡単な振る舞いの例から始めてみましょう。何か実装を書く前に以下のコードを書いてください。)

# in spec/calculator_spec.rb
describe Calculator do
  describe '#add' do
    it 'returns the sum of its arguments' do
      expect(Calculator.new.add(1, 2)).to eq(3)
    end
  end
end

rspec/rspec-core · GitHub

あれ、shouldどこいったの…?
と思っていると、どうやらshouldが時代遅れになって、expect to使えということになったらしいです。ちなみに知ったのは半月くらい前です。だいたい去年の今頃にあった発表がこちら。
http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax:ttile
どうやら、BasicObject*1クラスを継承したクラスをテストするときに、今までの構文だと不具合があったようです。
上のコードで比べてみると、今まで

Calculator.new.add(1, 2).should eq 3

って書いてたのを

expect(Calculator.new.add(1, 2)).to eq 3

と書くだけみたいで、それほど大きな違いではなさそうですね。Ruby - RSpecのshouldはもう古い!新しい記法expectを使おう! - Qiita [キータ]によると>や<などの比較演算子expect(hoge).to be > fugaみたいな感じで使うそうです。expectにブロックを渡してちゃんとyieldやってるかとか例外が起きるかとかのテストもできるようです。その他のcontextやdescribe、be_xxxxみたいなのは健在なので、よっぽどひねくれたことをしてない限りshouldをexpect toに書き換えるだけでよさそうです。

*1:必要最低限の機能しかない特殊なクラス。普段暗黙的に継承しているObjectクラスはこれの子孫