test "ほげほげさんの記事に行ける" do article = articles(:article1) visit_with_auth "/articles/#{article.id}", 'hogehoge_san' assert_equal "#{article.title} | みんなの日記サイト", title end
この最後のtitle
の意味がわからなくて時間を溶かしたんですが、Capybaraの提供するメソッドだった模様。
Class: Capybara::Node::Document — Documentation for teamcapybara/capybara (master)rubydoc.info
いきなりtitle
と書くだけで使えるのがよくわからなかったんですが、こういう理由だったらしいです。
visitでページアクセスすると、page変数に格納されるCapybara::Sessionオブジェクトが更新される。 後述のAction, Matcher, Finderなどは 暗黙的に このページオブジェクトに対して操作を実行する。
(中略)
Capybaraは要素を検索し、操作したり内容を検証したりできる。 各メソッドは要素オブジェクト(Capybara::Node)に対するインスタンスメソッドとして動作するが、 省略した場合(Capybaraのクラスメソッドとして記述した場合)はvisitで取得したページpageに対して適用される。
自分でもCapybaraのソースコードを眺めてみました。
require 'capybara' module Capybara module DSL # 中略 ## # # Shortcut to accessing the current session. # # class MyClass # include Capybara::DSL # # def has_header? # page.has_css?('h1') # end # end # # @return [Capybara::Session] The current session object # def page Capybara.current_session end
このpage
メソッドは、current_session
メソッドをたどっていった先にある、モジュールのインスタンス変数の中のオブジェクトを参照しているみたいでした(めちゃくちゃ詳しくは読めてません)。
assert_equal
やtitle
は、このオブジェクトに対して働いてたんですね。全然わかっていなかった……というメモです。