我们有一个 Rails 应用程序刚刚升级到 Rails3,使用 Devise 的 Rails3 gem 进行身份验证。我们一直在使用 Capybara 和 Celerity 后端来测试一些页面。
在浏览器中访问应用程序时,当用户尝试访问受保护的页面/控制器时,Devise 会以重定向到登录页面的方式进行响应。
在 Rails 2.x 版本的 Devise 中,即使传入的请求有一个空白的接受标头,它也能正常工作*/*
。
在 Rails 3 版本中,当接受标头为空时,Devise 会以纯文本字符串响应。
空白的接受标头很重要的原因是因为我们使用 Capybara 的 Celerity 后端来测试一些页面,显然 Celerity 发送了一个空白的接受标头,因此不会被 Devise 重定向。此行为已从 Devise for Rails 2.x 更改为 Devise for Rails 3。
Celerity 以 UnexpectedPageException 失败,并且服务器日志报告请求是*/*
作为接受标头发出的。
在完全相同的测试套件上使用 Selenium/Webdriver 后端时,问题就消失了。
有两种方法可以解决这个问题:
- 告诉 Devise 以某种方式始终假定 text/html 作为接受标头并做出相应的响应。那怎么可能呢?我们必须覆盖控制器吗?
- “修复” Celerity 以发送 text/html 作为接受标头。如何才能做到这一点?
- 这是一个 HTMLUnit 问题/错误吗?
对我来说,#2 看起来像是解决此问题的“正确”方法,但我不确定 Celerity/HTMLUnit 缺少接受标头是错误还是功能。想法?