如何在测试之间重复使用Capybara会话?

pup*_*eno 17 cookies session ruby-on-rails capybara

我想继续使用相同的会话,我的意思是Rails在Test::Unit使用Capybara的各种集成测试之间的会话.Capybara::Session在重新使用的所有测试中,该对象是相同的,但是当我在另一个测试中访问另一个页面时,我立即退出.

挖掘我发现capybara_session.driver.browser.manage.all_cookies在一个测试和下一个测试之间被清除.

有什么想法?或为什么?或者如何避免它?

试图解决这个问题,我将cookie保存在一个类变量中,稍后通过运行重新添加:

capybara_session.driver.browser.manage.add_cookie(@@cookie)
Run Code Online (Sandbox Code Playgroud)

它似乎工作,cookie就在那里,但是当有一个请求时,cookie被替换为另一个,所以它没有任何效果.

有没有其他方法来实现这一目标?

Eri*_*son 15

在与页面交互的capybara代码之后添加以下内容:

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

or

page.instance_variable_set(:@touched, false)
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,这些可能会有所帮助:

https://github.com/railsware/rack_session_access

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

  • 很棒,将"page.instance_variable_set(:@ touching,false)"添加到全局的(:each)块和"page.instance_variable_set(:@ touching,true)"之后,全局的(:all)为我们节省了大约20%测试运行时(具有> 250个水豚测试块).幸运的是,调整导致只有大约1%的新测试失败,可以修复.NICE!:) (5认同)
  • 我喜欢你!:)这有效*很棒*.我遇到了rspec-steps的问题,关于上下文中的上下文(可能特定于我们的测试设置;我们正在修补rspec的上下文). (2认同)

小智 5

如果您正在尝试将单个示例串联到一个故事(黄瓜样式,但没有黄瓜),您可以使用名为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
Run Code Online (Sandbox Code Playgroud)

因为rspec回滚了它的所有实例变量,会话,cookie等.

如果你安装了rspec-steps(注意:目前与rspec比2.9不兼容),你可以用'steps'替换'describe',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
Run Code Online (Sandbox Code Playgroud)