RSpecのソースコードの手がかり

本格的にRSpecを使う場合,Test::Unitのssert_~みたいなメソッドを追加したくなることもあるでしょう。そういった際にどういったところを読めばよいかの手がかりのようなものを示したいと思います。*1

まず,テスト自体の実行の流れの追い方。lib/context/runner/option_parser.rbでまずオプションの解析などが行われる。lib/context/runner/context_runner.rbのrunメソッドでメッセージを表示したりさせている。RSpecの挙動を調べる際はこのファイルからたどっていけば追いやすいはず。

contextはlib/spec/runner/extentions/kernel.rbで定義されている。contextブロック内で使用可能な語彙(specify, setup, teardown, context_setup, context_teardown)については,lib/spec/runner/context_eval.rbで定義されている。

一つのspecificationを実行する際の挙動についてはlib/spec/runner/specification.rbで定義されている模様。

Test::Unitのassert_~みたいなメソッドに当たるメソッドはlib/spec/expectations/以下のファイル群で定義されている。Ruby組み込みのクラスを拡張している部分に関してはlib/spec/expectations/extensions/以下のファイル群を見れば良い。

RSpecの醍醐味であるshould〜みたいな文法を実現しているのがlib/spec/expectations/should/以下のファイル群である。lib/spec/expectations/should/base.rbとlib/spec/expectations/should/should.rbではshouldの後に続けられる語彙が定義されている。単なる委譲ではなくてRSpecについて特殊な意味合いを持つ語彙についてはlib/spec/expectations/should/should.rbで定義されている。

should.not.beとかじゃなくshould_not_beとかというように書けるようにしているのは,lib/spec/expectations/sugar.rbである。

最近のバージョンは読み込んでいないのでよく理解していないのですが,相変わらず色々変化はあるようです。

ほぼ私信だったりしますが凄くニッチな人にとってはある程度は有用な情報だと思うので公開しました。

*1:実は第11回Rails勉強会でやったことなのだけどみんなログを書き忘れてしまった模様。