【问题标题】:Can't correctly parse JSON fixture in tests无法在测试中正确解析 JSON 夹具
【发布时间】:2017-02-09 16:38:16
【问题描述】:

我在旧的 Rails 应用程序 (3.2.22) 中使用 Test::Unit,我正在尝试测试一个访问外部 api 的服务类。

我正在使用 webmock 并试图让一个 json 文件装置工作,但我不断收到来自 json 文件的解析错误。

我的测试存根如下所示:

response_data = fixture_file_upload('easypost/order_response.json')
stub_request(:post, 'https://api.easypost.com/v2/orders').
  to_return(:status => 200, :body => File.read(response_data))

我的order_response.json 文件如下所示:

{
  'mode':'test',
  'reference':'Order',
  'is_return':false,
  'options':{'currency':'USD','label_date':null}
}

当我运行测试时,我得到一个解析错误:

JSON::ParserError: 757: unexpected token at '{'mode':'test','reference':'Order','is_return':false,'options':{'currency':'USD','label_date':null}}'

发生了什么事?

更新:

通过在 JSON 文件中使用双引号使其正常工作:

{
  "mode":"test",
  "reference":"Order",
  "is_return":false,
  "options":{"currency":"USD","label_date":null}
}

谁能解释为什么这是必要的?

【问题讨论】:

    标签: ruby-on-rails json testunit


    【解决方案1】:

    来自fine specification

    字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义。

    and and object 是一组键/值对,其中键是字符串:

    这意味着:

    {
      'mode':'test',
      'reference':'Order',
      'is_return':false,
      'options':{'currency':'USD','label_date':null}
    }
    

    不是 JSON,因为 JSON 字符串使用双引号且仅使用双引号,这有点像 JSON。当您为字符串切换到双引号时:

    {
      "mode":"test",
      "reference":"Order",
      "is_return":false,
      "options":{"currency":"USD","label_date":null}
    }
    

    那么你就有了 JSON,一切都应该可以工作了。

    【讨论】:

      【解决方案2】:

      这是为了使其更简单,避免为 javascript 保留关键字使用另一种转义方法

      我认为这篇文章可能有助于理解引用的必要性(以及我在哪里找到上述引用):JSON Spec - does the key have to be surrounded with quotes?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 2014-04-02
        • 2020-07-24
        • 2013-10-14
        • 2012-08-12
        • 2021-09-24
        • 1970-01-01
        相关资源
        最近更新 更多