ruby-on-rails – Rails – 失去与Integration Tests和Capybara – CSRF相关的会话?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails – 失去与Integration Tests和Capybara – CSRF相关的会话?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Rails 3.1.0.rc4,我正在努力使用capybara的新的类似牛扒的DSL和Rspec进行集成测试(使用Devise身份验证)

我遇到的问题是,当我运行集成测试时,来自capybara的机架测试驱动程序似乎完全失去了用户登录会话,实际上,会话似乎完全清除了.

经过几天的调试,我完全失去了为什么.逐行通过中间件堆栈,我相信我已经将问题归结为导致此问题的ActiveRecord :: SessionStore中的一些问题.我读了here,如果无法验证CSRF令牌,Rails将会清除会话,这让我相信我有一些配置错误,并且由于某种原因,这一个测试不正确地验证CSRF令牌.

这是在/ initializers目录中的session_store.rb中的内容

MyApp::Application.config.session_store :active_record_store

谁知道关于CSRF保护的任何人有什么潜在的为什么会发生这种情况?

另外,这里有一些要注意的事情:

>我试图测试的东西实际上在浏览器本身中工作,只有这一个测试正在放弃会话
>会话似乎被删除后提交的表单,其中的操作url是另一个服务器.我在测试中使用VCR gem来捕获对这个外部服务器的请求/响应,而且我相信我已经将外部请求作为问题排除了,这可能与CSRF令牌无法验证有直接关系,从而清除会话.
>其他涉及登录/使用会话的测试不会删除会话

任何人都可以给我任何关于这里发生的事情的线索,为什么一个测试似乎是任意地丢弃会话并失败在我身上?我做了很多调试,并尝试了我可以想到的一切.

解决方法

我也是新来的水豚,我也有类似的问题.

我试图登录一个用户做这样的事情:

post user_session_path,:user => {:email => user.email,:password => 'superpassword'}

而且,这是正常的工作,直到我试图做一些与水豚的事情,如访问一个页面,只是测试用户是否登录.这个简单的测试没有传递:

visit root_path
page.should have_content("logout") #if the user is logged in then the logout link should be present

起初我以为水豚正在清理会议,但我错了.花了我一段时间才意识到的是,司机capybara正在使用自己的会话,所以从capybara的角度来看,我的用户没有登录,为此你必须这样做

page.driver.post user_session_path,:password => 'superpassword'}

不知道如果这是你的情况,但希望有帮助.

猜你在找的Ruby相关文章