自分が TurnipFormatter の RSpec3 対応時に気づいた点を挙げていきます。もっと他にもあるのかな。ありそう。
[追記] 見返してみたら「両方で動作させるために」というよりも「RSpec 3 に移行するために」の内容だったので、実際に自分が対応した時の commit も併せて載せておきます。一応 RSpec2/3両方で動くような変更のはず。きっと。
実際の対応様子
1. Formatter API の変更
RSpec 2 から 3 になることで影響度が一番高いのはこれでしょうか。特に気をつけることは
RSpec::Core::Formatter.register
を使い、クラス Custom Formatter として登録し、必要な hook method を指定する必要があるexample_failed()
やdump_summary()
などの hook method に渡される値がRSpec::Core::Example
から Notification に変わっている
ぐらいです。たぶん。各 hook method の動き自体は変わっていない(はず)なのでそこは流用できそう。
See Also
- custom formatters - Formatters - RSpec Core - RSpec - Relish
- Ruby - RSpec3の新しいFormatter APIについて - Qiita
2. RSpec::Core::BacktraceFormatter が module から class に変わった
バックトレースを綺麗綺麗にするのに使っている人はほんの少し影響あるかも。include とかしてなければ大丈夫のはず
3. マッチャーで failed の時に raise されるクラスが StandardError ではなく Exception のサブクラスになっている
これは昨日書いた内容です
RSpec 3 から RSpec::Expectations::ExpectationNotMetError がクラス名省略の rescue で捕まえられなくなった
4. Example を生成する時のパラメータ指定に制限がついた
おもにテストを書く時に、とりあえずモックとして RSpec::Core::Example
を作る時にひっかかりそうな部分。
上記 commit の通り、 Example を生成したあとに metadata に入れる分には問題なかった
5. example.execution_result
が Hash から ExecutionResult
ってクラスになった
Hash のままでも使えたけど Deprecate Warnings がアレだったので消すために対応。
See Also
6. example の親 example group を取得するキーが変更
before
example.metadata[:example_group][:example_group]
after
example.metadata[:parent_example_group]
これは直感的でよい
テスト環境を整える
実際に RSpec 2 とか 3 どちらも意識して作ることになるんですが、なんだかんだでどっちか忘れてしまうこともあります。人間だもの。 そういう時はやはり自動テストに任せるのが良いです。TurnipFormatter も漏れなく TravisCI を使わせていただいていますが、 TravisCI には「ライブラリのバージョンを切り替えてテストを実行する」みたいな仕組みがあります。
Support testing rspec 2.14/2.99/3.0
上記のように、テストしたい RSpec のバージョンをそれぞれ記載した Gemfile を用意し、.travis.yml
にリストアップすると
https://travis-ci.org/gongo/turnip_formatter/builds/31230560
こんな感じになります
[Ruby 1.9, 2.0, 2.1.0, 2.1.2, JRuby] × [RSpec 2.14.x, 2.99.x, 3.0.x]
計15通りのテストを実行してくれました。便利
See Also
まとめ
はやく 2 か 3 どっちか切れて欲しい