Как вернуть объект вместо строки для ответа с помощью 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) {
  //..
});
Другие вопросы по тегам