3

我目前正在尝试确保我的 rails 应用程序可以优雅地处理带有无效 UTF-8 数据的 POST 方法(例如 \xFF)(使用机架中间件)

不幸的是,为此编写测试非常困难。

我尝试过的一件事是使用 Capybara 用无效的 UTF-8 填写我的一个表单字段并提交,但这会在我的测试输出中导致终端中的以下输出 - 而且它不是由 Rails 打印的!

错误:字符串不在 utf-8 中

是否可以模拟包含无效 UTF-8 数据的 POST 以验证是否显示 400 错误(或类似错误)?

注意:我试图避免必须针对应用程序的单独运行实例运行(例如,对它使用'curl'),而只是直接使用 Capybara(或类似的)运行

4

4 回答 4

2

用无效的 UTF-8 填写表格是什么意思?您填写表格的字符没有任何编码,它们在发送表格时被编码。这句话对于一些不能编码所有字符但 UTF-8可以的编码是有意义的。

如果您想\xFF从浏览器将字节发送到服务器,只需拉出该浏览器的开发人员工具,编辑表单的属性以在表单上的某处accept-charset="ISO-8859-1"写入ÿ并按发送即可。将ÿ被编码为%FF无法解码为 UTF-8 的 a:

http://i.imgur.com/0KCpa9p.png

在此处输入图像描述

于 2013-03-14T10:12:06.663 回答
2

您可以尝试发布包含无效 utf-8 数据的文件附件,但这也取决于您的表单本身。但是,当您正在测试一个相当模糊的边缘情况时,您总是可以创建一个只能在开发/测试环境中访问的表单,并且该路由也只能用于测试。

这至少允许您以安全、仅测试的方式定位处理无效 utf-8 数据的代码。

于 2013-03-11T16:43:25.173 回答
0

您应该能够通过使用机架测试而不是使用水豚来构建一个帖子来做到这一点。

例如以下请求规范 ( spec/requests/utf8_spec.rb):

require 'spec_helper'

describe "Invalid UTF-8" do
  it "handles invalid UTF-8 in post data gracefully" do
    post "/users", :user => {:name => "Test \xFF boom"}
  end
end

运行时产生以下内容:

1) Invalid UTF-8 handles invalid UTF-8 in post data gracefully
   Failure/Error: post "/users", :user => {:name => "Test \xFF boom"}
   ArgumentError:
     invalid byte sequence in UTF-8
   # ./app/controllers/users_controller.rb:17:in `create'
   # ./spec/requests/utf8_spec.rb:5:in `block (2 levels) in <top (required)>'
于 2013-07-03T09:54:04.600 回答
0

正如此ThoughtBot博客文章中所述,这在单元测试中对我有用:

"hello joel\255".force_encoding('UTF-8')

不知道你如何说服水豚这样做。

于 2013-05-16T11:38:26.407 回答