以前作った Rails アプリの一部を分離したアプリに Pact を利用して API を実装しようとしたんだけど、昨日 RSpec 2 では動かないということが発覚したので RSpec 3 への移行作業。
ひじょーに気が重くて避けられるなら避けたかったので無駄に Pact の内部のコードを追いかけてしまったが、結論から言うと自分の使い方では RSpec 3 への移行コストは割と杞憂だったようだ。
以下、やったことをざざっとメモ。なお、アップグレード対象バージョンは 2.99 → 3.5.1
- spec_helper.rb を退避して rails g から spec_helper.rb, rails_helper.rb を上書きインストール
- rspec-rails は spec_helper ではなく rails_helper を呼べということでエディタの力でエイヤ
- rails_helper.rb の中だけ手で書き戻す
- subject, should の部分は特に直す必要がなかった(たぶん事前の情報で最小限で済むように準備しておいたのだろう)
- be_true, be_false はエディタの力でエイヤ。
- 時間が掛かったのは RR
最近はそうでもないんだけど、以前は RSpec の test double の記法がどうしても納得いかなくて RR というライブラリを一部のテストに採用している。今回この RR を採用しているプロジェクトの RSpec を 2 から 3 に上げて動かなくなったのでその対処について。
結論から言うと RR 自体は RSpec 3 には対応していない。
as well as the following test frameworks:
- RSpec 2
- Test::Unit via test-unit-rr
- MiniTest 4
- Minitest 5
Support for Rspec 3 · Issue #65 · rr/rr
There is no plan to support RSpec 3.
If we support RSpec 3, we\'ll create rspec-rr gem instead of implementing RSpec 3 support into rr itself.
アッハイ。
でも実際には
stub(Klass).method {}
を
RR.stub(Klass).method {}
に書き換えれば動く。
本来 RSpec 3 は stub, mock を double の alias に使わないとかグローバル汚染させないモードもあるらしいので、共存することもできるんじゃないかという気がしたんだけど、なんか割と小さい変更で動くようになってしまったのでどうでもよくなってしまった。
少なくとも RR で書いていたものをすべて RSpec や Minitest の double の書き方に合わせ直す方がはるかに面倒だし、この程度で済めば御の字だろう。
[2016-07-27 追記]
after { RR.reset }
がないとあちこち変な動きをするみたい。