如何解决未正确解析 node.js 项目中带有 Jest 测试的 JSON 对象
我有一个具有以下界面的对象:
export interface range {
max: number,min: number
}
我正在从 GET 调用返回 - 调用的函数如下所示。
export async function testHandler() {
let result : range = {
min: 101,max: 202
};
return {
body: JSON.stringify({
data: result
}),statusCode: 200
};
}
这个想法是我想将 range 对象的一个实例返回并解析到我的 Jest 测试中,如下所示:
import { testHandler,range } from "..";
describe("TestEnv",() => {
const expectedResponseShape = {
body: expect.any(String),statusCode: expect.any(Number)
};
describe("Test Range Test",() => {
it("should return the correct data shape: min and max,>= 0",async () => {
const response = await testHandler();
//make sure we're getting a response with an HTTP body
expect(response).toEqual(expectedResponseShape);
expect(response.statusCode).toEqual(200);
let r : range = JSON.parse(JSON.stringify(response.body));
expect(r).not.toBeUndefined();
console.log(`range: ${r}`);
console.log(`range.min: ${r.min}`);
console.log(`range.max: ${r.max}`);
for(var propName in r) {
if(r.hasOwnProperty(propName)) {
console.log(`propname ${propName} =: ${r[propName]}`);
}
}
});
});
所以这就是事情变得非常奇怪的地方。对于我的生活,我无法弄清楚为什么 r
对象不会解析。日志输出如下:
Test Range Test
✓ should return the correct data shape: min and max,>= 0 (46ms)
console.log
range: {"data":{"min":101,"max":202}}
console.log
range.min: undefined
console.log
range.max: undefined
console.log
propname 0 =: {
console.log
propname 1 =: "
console.log
propname 2 =: d
console.log
propname 3 =: a
console.log
propname 4 =: t
console.log
propname 5 =: a
依此类推,直到
console.log
propname 25 =: 2
console.log
propname 26 =: 0
console.log
propname 27 =: 2
console.log
propname 28 =: }
console.log
propname 29 =: }
所以对象的数据(即 {min: 101,max:202}
)似乎进入正常,但似乎没有被正确解析。
我想要的是测试中的最终对象,它能够读取 r
类型的结果 range
,并能够使用 r.min
和 {{1} 读取其属性}.
答案可能很明显,但我做错了什么?
解决方法
首先,“范围”在 data
属性中,而不是直接在响应的 body
中。
其次,您对已经是字符串的 JSON.stringify
执行 response.body
。
所以,使用
let r : range = JSON.parse(response.body).data;
奇怪的日志也是由于 JSON.stringify
的额外 response.body
。您的 r
最终成为一个字符串,而 for .. in
将它作为一个字符数组进行迭代。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。