my_back_pages

プログラミング学習の記録 Ruby / Rails / FjordBootCamp

【Rails】Capybaraでvisitしたページのオブジェクトと、pageメソッドについて【Capybara】

  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に対して適用される。

qiita.com

自分でも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

https://github.com/teamcapybara/capybara/blob/6267ff65a294a7dcbe9d7281c30cc2d91b08b093/lib/capybara/dsl.rb#L45

このpageメソッドは、current_sessionメソッドをたどっていった先にある、モジュールのインスタンス変数の中のオブジェクトを参照しているみたいでした(めちゃくちゃ詳しくは読めてません)。

assert_equaltitleは、このオブジェクトに対して働いてたんですね。全然わかっていなかった……というメモです。