Как вернуть объект вместо строки для ответа с помощью 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 на