Ruby on Rails Integration Testで使うpathはActionDispatch::Integration::Session#path

Rails Guides Integration Testing Examplesで突然使われている、pathというキーワード。

 

pathは、現在のレスポンスのパス(”/”とか”/posts”とか)を返してくれるが、これがどのクラスで定義された何者なのかといった情報がドキュメントに無い。

Integration Testでは、レスポンスがどのパスになったかを確認するために、pathを多用するが、これが何者なのか分からずに使い続けるのは何だか気持ち悪い。

 

そこで、Integration Testをデバッグして、pathを所有するクラスを確かめてみた。

すると、Integration Testで使われているpathの実体はActionDispatch::Integration::Session#pathであるっぽい。

 

実際に確認してみるために、疑似的なIntegration Testを作成してみる。

 

debuggerを仕込んだ部分でブレークしたら、pathの実体として怪しそうなメソッドにブレークポイントを仕込んでnext

b ActionDispatch::Integration::Session.path
next
[32751, 32780] in C
*** No sourcefile available for C
C:32766

どうやら、pathの実体はActionDispatch::Integration::Session#pathで間違い無さそうだ。

実体はC実装なのか。

 
 
 

では、Integration TestはActionDispatch::IntegrationTestを継承しているわけだけど、それだけでなぜ、ActionDispatch::Integration::Sessionのpathにアクセスできるのか?

 
 

Integration Testのテストメソッドからpathを使うと、ActionDispatch::Integration::Runner#method_missingが呼び出される。

 

ここで、@integration_session(ActionDispatch::Integration::Sessionクラスのインスタンス)が存在すれば、Integration Tsetをしているということで、このクラスにメソッド名とオプション、ブロックを渡して実行する。

→だからIntegration Testでpathが使える!

 

ActionDispatch::Integration::Runnerのメソッドには、ActionDispatch::Integrationにincludeされているから、アクセス可能ということになる。

 
 
 

・・・いや、ソース追っておいて、頭ごっちゃになりながら書いた記事だから本当にこれで正解なのか分からないけど。

それに、何気なく使われているpathというメソッド?変数?が、実際にどんなものなのかといったことを知るためには、Cのソース読むしか無いわけなので、諦めよう。。

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=1654