当我使用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对象,就像请求库那样。
答案 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) {
//..
});