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

时间:2014-12-31 05:41:11

标签: javascript node.js request fakeweb 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 Object的文章,没有解析它(使用nock),所以它应该返回JSON对象,就像请求库那样。

1 个答案:

答案 0 :(得分:7)

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

request method文档(强调我):

  

json - 设置body但值为JSON表示值,并添加Content-type:application / json标头。 此外,将响应正文解析为JSON。

     

回调参数有3个参数:

     
      
  • 适用时的错误(通常来自http.ClientRequest对象)
  •   
  • http.IncomingMessage对象
  •   
  • 第三个是响应正文(字符串或缓冲区,或 JSON对象,如果提供了json选项
  •   

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

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

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