7

当我使用它存根请求时,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);
});

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

附言。我可以在我的响应处理程序中添加下一个代码:

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 对象,与请求库的方式相同。

4

1 回答 1

8

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

request方法文档(强调我):

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

回调参数有 3 个参数:

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

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

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

section.request.json = true;
request(section.request, function (err, response, body) {
  //..
});
于 2015-01-02T14:09:54.643 回答