18

同じセッションを使い続けたいと思いTest::Unitます。つまり、Capybaraを使用するさまざまな統合テスト間のRailsのセッションを意味します。オブジェクトは再利用されるため、すべてのCapybara::Sessionテストで同じですが、別のテストで別のページにアクセスすると、すぐにログアウトされます。

capybara_session.driver.browser.manage.all_cookies掘り下げてみると、あるテストと次のテストの間でそれがクリアされていることがわかりました。

どのようにアイデアはありますか?またはなぜですか?またはそれを回避する方法は?

これを回避するために、Cookieをクラス変数に保存し、後で実行して再度追加しました。

capybara_session.driver.browser.manage.add_cookie(@@cookie)

動作しているように見えますが、Cookieはありますが、リクエストがあると、Cookieが別のCookieに置き換えられるため、効果がありませんでした。

これを達成する他の方法はありますか?

4

4 に答える 4

18

ページと対話するカピバラ コードの後に​​次を追加します。

Capybara.current_session.instance_variable_set(:@touched, false)

or

page.instance_variable_set(:@touched, false)

それでもうまくいかない場合は、次の方法が役立つ場合があります。

https://github.com/railsware/rack_session_access

http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/

于 2012-09-30T05:29:45.347 に答える
5

個々の例を 1 つのストーリーにまとめようとしている場合 (きゅうりスタイルですが、きゅうりは使用しません)、rspec-steps と呼ばれる gem を使用してこれを実現できます。たとえば、通常、これは機能しません。

describe "logging in" do
  it "when I visit the sign-in page" do 
    visit "/login"
  end
  it "and I fill in my registration info and click submit" do
    fill_in :username, :with => 'Foo'
    fill_in :password, :with => 'foobar'
    click_on "Submit"
  end
  it "should show a successful login" do
    page.should have_content("Successfully logged in")
  end
end

rspec はインスタンス変数、セッション、Cookie などをすべてロールバックするためです。

rspec-steps (注: 現在、2.9 より新しい rspec とは互換性がありません) をインストールすると、「describe」を「steps」に置き換えることができ、Rspec と capybara はサンプル間で状態を保持し、より長いストーリーを構築できるようになります。

steps "logging in" do
  it "when I visit the sign-in page" #... etc.
  it "and I fill in" # ... etc.
  it "should show a successful" # ... etc.
end
于 2013-01-17T20:47:17.330 に答える
3

@browser.manage.delete_all_cookiesメソッドにモンキー パッチを適用することで、テスト間で発生する への呼び出しを防ぐことができますCapybara::Selenium::Driver#reset!。それはきれいな方法ではありませんが、うまくいくはずです...

次のコードをプロジェクトに追加して、実行に実行されるようにしますrequire 'capybara'

class Capybara::Selenium::Driver < Capybara::Driver::Base
  def reset!
    # Use instance variable directly so we avoid starting the browser just to reset the session
    if @browser
      begin
        #@browser.manage.delete_all_cookies <= cookie deletion is commented out!
      rescue Selenium::WebDriver::Error::UnhandledError => e
        # delete_all_cookies fails when we've previously gone
        # to about:blank, so we rescue this error and do nothing
        # instead.
      end
      @browser.navigate.to('about:blank')
    end
  end
end

興味のために、問題のある行はここのカピバラのコードベースで見ることができます: https://github.com/jnicklas/capybara/blob/master/lib/capybara/selenium/driver.rb#L71

于 2012-10-02T17:35:53.377 に答える
0

この種の動作が必要な理由を投稿する価値があるかもしれません。通常、カピバラにモンキー パッチを適用する必要があるということは、意図しない目的で使用しようとしていることを示しています。多くの場合、テストを再構築して、統合テスト間で永続化された Cookie を必要としないようにすることができます。

于 2012-12-15T11:20:05.710 に答える