如何使用nock返回对象而不是字符串以进行响应?

zis*_*she 7 javascript request node.js fakeweb nock

当我使用nockString来存根请求时,返回结果而不是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');
Run Code Online (Sandbox Code Playgroud)

检查:

console.log(put.response.body);
console.log(put.response.body.id);
Run Code Online (Sandbox Code Playgroud)

输出:

{"status":"OK","id":"05056b27b82"}
undefined
Run Code Online (Sandbox Code Playgroud)

在代码中我使用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);
});
Run Code Online (Sandbox Code Playgroud)

它在实际请求中返回一个对象.

PS.我可以在响应处理程序中添加下一个代码:

if (_.isString(body))
  body = JSON.parse(body);
Run Code Online (Sandbox Code Playgroud)

但是一些查询返回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);
Run Code Online (Sandbox Code Playgroud)

结果相同.

更新:

我读了几篇使用JSON Object的文章,没有解析它(使用nock),所以它应该返回JSON对象,就像请求库那样做.

nem*_*esv 7

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

request方法文档(强调我):

json - 设置body但值为JSON表示值,并添加Content-type:application/json标头.另外,将响应主体解析为JSON.

回调参数有3个参数:

  • 适用时出错(通常来自http.ClientRequest对象)
  • 一个http.IncomingMessage对象
  • 第三个是响应主体(如果json提供选项,则为 String或Buffer或JSON对象)

所以你需要在你的对象上设置json属性:truesection.request

var request = require('request');
// ...

section.request.json = true;
request(section.request, function (err, response, body) {
  //..
});
Run Code Online (Sandbox Code Playgroud)