Как вернуть объект вместо строки для ответа с помощью 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
- Третий - это тело ответа (String или Buffer, или объект JSON, если
json
опция поставляется)
Так что вам нужно установить json
собственность на true
на ваше section.request
объект:
var request = require('request');
// ...
section.request.json = true;
request(section.request, function (err, response, body) {
//..
});