如何返回对象而不是字符串以响应 nock

How to return object instead of string for response with nock?

本文关键字:字符串 nock 响应 对象 何返回 返回      更新时间:2023-09-26

当我用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.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 对象,就像请求库这样做一样。

您的nock配置没有任何问题,但是您没有告诉request将响应解析为JSON。

request方法文档(强调我):

json - 将正文设置为值的 JSON 表示形式,并添加内容类型:应用程序/json 标头。此外,将响应正文解析为 JSON。

回调参数获得 3 个参数:

  • 适用时出现错误(通常来自 http。客户端请求对象)
  • 一个 http.传入消息对象
  • 第三个是响应正文(字符串或缓冲区,或 JSON 对象,如果提供了 json 选项

因此,您需要将 json 属性设置为section.request对象上的true

var request = require('request');
// ...
section.request.json = true;
request(section.request, function (err, response, body) {
  //..
});