Rspecのコードリーディング
bundle exec rspecを実行したときの処理を追ってみた。
まずは、binをみてみる。
vendor/bundle/ruby/2.1.0/bin/rspec
1 | #!/usr/bin/env ruby |
loadメソッドにGem.bin_pathで生成されるものを渡している。
Gem.bin_path(‘rspec-core’, ‘rspec’, “>=0”)をpryで実行すると以下の文字列が取得できた。
1 | => "/Users/shoyan/Development/rails-sample/vendor/bundle/ruby/2.1.0/gems/rspec-core-3.3.1/exe/rspec" |
rspec-core-3.3.1/exe/rspecをみてみると、たった3行のコードがあるだけだった。
1 | #!/usr/bin/env ruby |
RSpec::Core::Runner.invokeはrspecを実行するトリガーのようだ。
rspec-core-3.3.1/lib/rspec/core/runner.rbをみてみる。
Provides the main entry point to run a suite of RSpec examples.
というコメントがあった。
Rspec examplesのスイートを実行する主要なエントリポイントを提供する と書いてある。
self.invokeをみると、disable_autorunとrunを実行して、runの戻り値が0でない場合はexitをrunの戻り値で実行している。
1 | #Runs the suite of specs and exits the process with an appropriate exit |
ここで重要なのがrunなので、runの処理をおっていく。
runはself.runとrunがあるが、ここで実行されているのは、self.runのほう。
self.runはoptionsを取得して、それをnewして戻り値のインスタンスのrunメソッドを実行している。
ここでrunが実行される。
1 | # Configures and runs a spec suite. |
runメソッドはsetupとrun_specsを実行している。
setupはerror streamとoutput streamをセットしたり、オプションの設定をしたり、rspec関連のファイルを読み込んでいる。
run_specでテストを実行している。
run_specは全てのテストが成功したら0を返す。
テストに失敗したり何かしらの設定に失敗したら1を返す。