[前][次][番号順一覧][スレッド一覧]

rails:3960

From: dezawa <dezawa@a...>
Date: Wed, 08 Jan 2014 16:23:09 +0900
Subject: [rails:3960] Capybara (2.2.0)でcookie情報を得たい

出沢@Rails2/Test から Rails4/Devise/RSpec/Capybara/Poltergeist に移行し
ています。

Development環境でブラウザで試すと期待通り動くのに、テストが通らない現象
に出会いました。
logを見るとCapybaraテスト環境でcookieがうまく機能していないようです。

cookieの内容を確認しようと思ったのですが得ることができませんでした。
1. cookieの内容を取得する方法
2. cookieがうまく設定されていないとしたら、テスト環境で設定する方法
をご指導ください。
環境は Ubuntu 13.10(VMplayer)
ruby 1.9.3
rails (4.0.1)
rspec (2.14.1)
capybara (2.2.0)
poltergeist (1.5.0)
devise (3.2.2)

です

###
のたうった記録
単純に
  cookies[:BK_year].should == Time.local(2014,1,1)
ですと
     NameError:
       undefined local variable or method `cookies' for
       #<RSpec::Core::ExampleGroup::Nested_5:0xacd7f6c>
となります。

Googleで capybara cookie を検索すると色々でてきましたがどれでもうまく行
きませんでした。

一番迫ったのが kennyjさんのブログ
http://kennyj-jp.blogspot.jp/2011/10/rails31-with-rspec-request.html
を参考に、
  def cookies
    Capybara.current_session.driver.
      browser.current_session.
      instance_variable_get(:@rack_mock_session).cookie_jar
  end
を定義したときです。

が、この時も cookies[:BK_year]は nil でした。
この時 cookiesは以下の様になっています。
       +#<Rack::Test::CookieJar:0xc340880
       + @cookies=
       +  [#<Rack::Test::Cookie:0xc6e669c
       +    @default_host="www.example.com",
       +    @name="_msdn_session",
       +    @name_value_raw=
       +     "_msdn_session=NzhONXh2eWZBYjgy。。。。9faacd6f03a581",
       +    @options={"path"=>"/", "HttpOnly"=>nil,
"domain"=>"www.example.com"},
       +    @value=
       +     "_msdn_session=NzhONXh2eWZBYjgy。。。。9faacd6f03a581",
       +   #<Rack::Test::Cookie:0xc0cfee8
       +    @default_host="www.example.com",
       +    @name="request_method",
       +    @name_value_raw="request_method=GET",
       +    @options={"path"=>"/", "domain"=>"www.example.com"},
       +    @value="GET">],
       + @default_host="www.example.com">

「CookieJarのlocal変数cookiesに配列要素として Cookie がある。」
様に見えます。

rack-test-0.6.2/lib/rack/test/cookie_jar.rb によれば以下の様になっている
ので、
     def [](name)
        cookies = hash_for(nil)
        # TODO: Should be case insensitive
        cookies[name] && cookies[name].value
      end
      def hash_for(uri = nil)
        cookies = {}
        @cookies.each do |cookie|
          cookies[cookie.name] = cookie if !uri || cookie.matches?(uri)
        end
        return cookies
      end

cookies["_msdn_session"]を呼んでみますと
"OWc0ZWFXMnA3。。。59116062" が得られます。(@valueの値とは異なっている)
Marshalされているのか、と
http://stackoverflow.com/questions/9224001/capybara-cucumber-getting-cookies
を参考に Marshal.load(Base64.decode64(cookies["_msdn_session"]))
としてみますと
     TypeError:
       incompatible marshal file format (can't be read)
       	format version 4.8 required; 72.110 given

と言う所で力尽きています。


--
ML: rails@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

->    3960 2014-01-08 08:23 [dezawa@a...         ] Capybara (2.2.0)でcookie情報を得たい    
      3961 2014-01-09 10:53 ┣[zn@m...             ]                                       
      3962 2014-01-09 11:45 ┃┗[dezawa@a...         ]                                     
      3964 2014-01-09 14:15 ┃ ┗[zn@m...             ]                                   
      3965 2014-01-09 15:15 ┃  ┗[dezawa@a...         ]                                 
      3963 2014-01-09 11:51 ┗[dezawa@a...         ]