【问题标题】:Testing of graceful handling of invalid UTF-8 in Rails在 Rails 中优雅处理无效 UTF-8 的测试
【发布时间】:2013-02-26 22:28:11
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 嘿 IAmFledge,你有没有找到解决方案?当我偶然发现这篇文章时,我正要开始同样的行动。
  • 嘿@fractious,目前我们只是进行了手动测试。如果您确实找到了一种自动化测试的好方法,请将其发布在此处作为答案! :)

标签: ruby-on-rails ruby validation utf-8 middleware


【解决方案1】:

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

这至少可以让您以安全、仅用于测试的方式处理处理无效 utf-8 数据的代码。

【讨论】:

  • 我们已经考虑将第二种方法作为一种选择。不确定它可以用 Capybara 完成吗?必须针对正在运行的应用程序实例进行测试。
【解决方案2】:

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

如果您想从浏览器将字节 \xFF 发送到服务器,就像拉出该浏览器的开发工具一样简单,将表单的属性编辑为 accept-charset="ISO-8859-1",在表单的某处写入 ÿ,然后按发送。 ÿ 将被编码为 %FF,无法解码为 UTF-8:

【讨论】:

  • 您好 Esailija,感谢您的回答。我们已经能够手动测试处理,但我的问题是围绕将其作为自动(可能是 Capybara)测试进行 - 而不是手动调整浏览器中的内容。
【解决方案3】:

this ThoughtBot blog post 中所述,这在单元测试中对我有用:

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

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

【讨论】:

    【解决方案4】:

    您应该能够通过使用 rack-test 而不是使用 capybara 构建帖子来做到这一点。

    例如以下请求规范 (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)>'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-02
      • 2016-07-30
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2011-09-08
      相关资源
      最近更新 更多