我正在使用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'}
不知道如果这是你的情况,但希望有帮助.