Rspec、expect表記移行での修正点まとめ
Rspecがshould表記からexpect表記にシフトしてしばらく経ちましたが、本日Rspecを実行するとかなりの数のエラーが検出されました。どうやらshould表記のままではエラーが出てしまうようなので、すべて修正する羽目に。
後学のために、今回修正した点をざっとまとめます。
今回の修正はRspecの中でも一部機能に関するものなので、細かい修正点については以下の記事をご参照のほど。
なお、使用しているRspecは3.1.0です。
stubメソッド
修正前
controller.stub(:check).and_return(true) Player.any_instance.stub(:get_hash).and_return(params)
修正後
allow(controller).to receive(:check).and_return(true) allow_any_instance_of(Player).to receive(:get_hash).and_return(params)
stub系は全滅でした。ちなみにallow().toはexpect().toでもイケるらしい。
等号演算子(==)
修正前
@p.logs.size.should == 4
修正後
expect(@p.logs.size).to eq(4)
shouldメソッド自体はまだ使えるものの、内部的にはexpectが走っているようで、eq()を使わない比較が不可能に。
be_trueメソッド, be_falseメソッド
修正前
@f.use().should be_true expect(flash[:alert]).to be_true
修正後
expect(@f.use()).to eq(true) expect(flash[:alert]).to be_present
be_trueを使うと「true?なんて関数ありませんよ」と怒られる羽目に。should時代独自の拡張だった模様。(追記参照)
ここはT/Fを返して欲しいのか、単に有効無効を知りたいのか*1によって修正方法が変わります。前者の場合はeq(true),eq(false)で修正します。後者の場合はbe_present,be_blankで直したほうがよいでしょう。
追記(2014/9/14)
従来のbe_true,be_falseはbe_truthy,be_falsyと名前を変え、
eq(true),eq(false)についてはbe true,be falseと表記できるらしいです。
(おまけ)be_***を使ってない場合は直そう
移行とは直接関係ないですが、たまーにこんなパターンも見かけます。
expect(@unit.is_overfatigued?).to be_false
じゃあここもeq(false)で直せばいいかって? そうじゃないでしょ。
nil?など最後に「?」がついてるメソッドの場合はbe_***という記法が使えます。なのでここはこうやって――
expect(@unit).not_to be_is_overfatigued
これで解決……いやなんかおかしい。
「be_is_overfatigued」って、英語的にどうなんだ。
これはメソッドの名付けも悪かったようです。Ruby以外の言語でよく用いるisValid()などのis~記法につられて書いてしまったため、このようなことが起きたようです。実はnil?の「?」ってisと同じ役割だったんですね!
したがって、isを削って最終的にはこの通り。
expect(@unit).not_to be_overfatigued
これで一件落着だね!