【发布时间】:2011-09-30 03:02:44
【问题描述】:
我正在使用 Rails 3.1.0.rc4,我正在使用 capybara 的新 Steak-like DSL 和 Rspec 进行集成测试(使用 Devise 身份验证)
我遇到的问题是,当我运行集成测试时,来自 capybara 的机架测试驱动程序似乎完全失去了用户的登录会话,实际上,会话似乎完全清除了。
经过几天的调试,我完全不知道为什么。逐行遍历中间件堆栈,我相信我已经将问题归结为导致此问题的 ActiveRecord::SessionStore 中发生的事情。我读过here,如果 Rails 无法验证 CSRF 令牌,它将清除会话,这让我相信我配置错误,并且由于某种原因,这个测试没有验证 CSRF令牌正确。
这是 /initializers 目录中 session_store.rb 中的内容:
MyApp::Application.config.session_store :active_record_store
是否有任何了解 Rails 中的 CSRF 保护的人对为什么会发生这种情况有任何线索?
另外,还有一些注意事项:
- 我要测试的东西实际上可以在浏览器本身中运行,只有这一项测试会丢弃会话
- 将操作 url 指向另一台服务器的表单提交到另一台服务器后,会话似乎被丢弃。我在测试中使用 VCR gem 来捕获对这个外部服务器的请求/响应,虽然我相信我已经裁定外部请求是问题,但这可能与 CSRF 令牌未进行身份验证直接有关,从而清除会话。
- 其他涉及登录/使用会话的测试不会丢弃会话
谁能告诉我这里到底发生了什么,以及为什么一个测试似乎随意放弃了它的会话并在我身上失败了?我做了很多调试,并尝试了我能想到的一切。
【问题讨论】:
-
我也有同样的问题...啊...
标签: ruby-on-rails rspec devise capybara csrf