Как вернуть объект вместо строки для ответа с помощью nock?
когда я заглушаю запрос с nock
возвращает String
результате вместо Object
даже 'Content-Type': 'application/json'
:
var response = {
success: true,
statusCode: 200,
body: {
"status": "OK",
"id": "05056b27b82",
}
};
Test.BuildRequest();
Test.SendRequest(done);
nock('https://someapi.com')
// also tried
// .defaultReplyHeaders({
// 'Content-Type': 'application/json',
// 'Accept': 'application/json'
// })
.post('/order')
.reply(200, response.body,
'Content-Type': 'application/json',
'Accept': 'application/json');
проверка:
console.log(put.response.body);
console.log(put.response.body.id);
выход:
{"status":"OK","id":"05056b27b82"}
undefined
в коде я использую request
модуль, который возвращает Object
С теми же данными. Я пробовал также sinon
(не работает для меня) и fakeweb
но получил ту же проблему.
код, который я пытаюсь тест:
var request = require('request');
// ...
request(section.request, function (err, response, body) {
if (err || _.isEmpty(response))
return result(err, curSyndication);
//if (_.isString(body))
// body = JSON.parse(body);
section.response.body = body;
console.log(body.id); // => undefined (if uncomment previous code - 05056b27b82)
_this.handleResponse(section, response, body, result);
});
и он возвращает объект в реальных запросах.
PS. Я мог бы добавить следующий код в свой обработчик ответов:
if (_.isString(body))
body = JSON.parse(body);
но некоторые запросы возвращают строку xml, и я не несу ответственности за такие изменения.
Fakeweb:
fakeweb.registerUri({
uri: 'https://someapi.com/order',
body: JSON.stringify({
status: "OK",
id: "05056b27b82",
}),
statusCode: 200,
headers: {
'User-Agent': 'My requestor',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
Test.SendRequest(done);
те же результаты.
обновление:
я прочитал пару статей, в которых используется объект JSON, без его разбора (с nock), поэтому он должен возвращать Объект JSON, так же, как и библиотека запросов.
1 ответов
нет ничего плохого в вашей конфигурации nock, однако вы не сказали request
для анализа ответа как JSON.
С request
метод документация (выделено мной):
json
- устанавливает тело, но в JSON-представление значения и добавляет заголовок Content-type: application/json. кроме того, анализирует тело ответа как JSON.аргумент обратного вызова получает 3 аргумента:
- ошибка, когда это применимо (обычно из http.Объект ClientRequest)
- http.Объект IncomingMessage
- третьим является тело ответа (строка или буфер, или JSON-объект, если поставлен)
поэтому вам нужно установить json
свойство true
на