1

我们有一个 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 后端时,问题就消失了。

有两种方法可以解决这个问题:

  1. 告诉 Devise 以某种方式始终假定 text/html 作为接受标头并做出相应的响应。那怎么可能呢?我们必须覆盖控制器吗?
  2. “修复” Celerity 以发送 text/html 作为接受标头。如何才能做到这一点?
  3. 这是一个 HTMLUnit 问题/错误吗?

对我来说,#2 看起来像是解决此问题的“正确”方法,但我不确定 Celerity/HTMLUnit 缺少接受标头是错误还是功能。想法?

4

1 回答 1

2

原来是 HTMLUnit 的问题。我已经为 Celerity gem 做了一个补丁,你可以在这里找到: https ://github.com/jarib/celerity/pull/49

它将默认接受标头设置为“text/html”,但还会添加一个可选参数来覆盖它。

于 2011-02-02T22:29:43.537 回答