zis*_*she 7 javascript request node.js 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');
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对象,就像请求库那样做.
您的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)
| 归档时间: |
|
| 查看次数: |
4375 次 |
| 最近记录: |