2017-02-09 10 views
0

Я использую Test :: Unit в старом Rails-приложении (3.2.22), и я пытаюсь проверить класс сервиса, который попадает на внешний api.Не удается правильно разобрать JSON-арматуру в тестах

Я использую webmock и пытаюсь получить файл json file fixture, но я продолжаю получать ошибки синтаксического анализа из 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}}' 

Что происходит?

UPDATE:

Понял работает, используя двойные кавычки в файле формата JSON:

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

Может кто-нибудь объяснить, почему это необходимо?

ответ

1

От fine specification:

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

и и объект представляет собой набор пар ключ/значение, где ключи являются строками:

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, и все должно работать.

0

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

Я думаю, что этот пост может быть полезным в понимании необходимости цитат (а также, где я нашел выше цитату): JSON Spec - does the key have to be surrounded with quotes?