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

时间:2017-02-09 16:38:17

标签: ruby-on-rails json testunit

我在一个旧的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}
}

有人能解释为什么这是必要的吗?

2 个答案:

答案 0 :(得分:1)

来自fine specification

  

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

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

enter image description here

这意味着:

{
  '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,一切都应该有用。

答案 1 :(得分:0)

  

这是为了简化并避免为javascript保留关键字提供另一种转义方法

我认为这篇文章可能有助于理解报价的必要性(以及我发现上述报价的地方):JSON Spec - does the key have to be surrounded with quotes?