Thanks Driven Life

日々是感謝

RSpec 2 / 3 両方で動作する Custom Formatter を作る時に気をつけること

自分が TurnipFormatter の RSpec3 対応時に気づいた点を挙げていきます。もっと他にもあるのかな。ありそう。

[追記] 見返してみたら「両方で動作させるために」というよりも「RSpec 3 に移行するために」の内容だったので、実際に自分が対応した時の commit も併せて載せておきます。一応 RSpec2/3両方で動くような変更のはず。きっと。

実際の対応様子

compare/2283293...c07c2c5

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

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 どっちか切れて欲しい