无法在测试中正确解析 JSON fixture

Can't correctly parse JSON fixture in tests

我在一个旧的 Rails 应用程序 (3.2.22) 中使用 Test::Unit,我正在尝试测试一个服务 class,它会访问外部 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}
}

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

来自fine specification

A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes.

and 和 object 是一组 key/value 对,其中键是字符串:

这意味着:

{
  '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 一切都应该正常。

This is to make it simpler and to avoid having to have another escape method for javascript reserved keywords

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