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

せらぴんブログ

サークル「せらぴん」のうのはな透です。やっぱり眼鏡っ娘が好き!!

Rspec、expect表記移行での修正点まとめ

ruby 技術

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

これで一件落着だね!

*1:should_not be_nilの代わりにshould be_trueを利用していた場合など