Jest;如何测试JSON.parse对字符串的成功解析

5

我正在为一个API编写单元测试。

如果我像这样做:

const apiResponse:object = JSON.parse(body)
expect(apiResponse).toHaveProperty('error')

如果 API 没有返回 JSON,那么我会得到以下类似错误信息:
SyntaxError:JSON 位置 0 处出现意外的 p 标记 at JSON.parse ()
与其在测试中得到错误,我希望测试失败。
有没有一个 jest 测试可以判断: 这个字符串是否可解析为有效的 JSON?

2
将其放在try/catch中。除了解析JSON之外,没有内置的测试JSON有效性的方法。 - Adrian
扩展@Adriani6的建议,将您的代码包装在Try/Catch中,然后在解析失败时返回异常,然后Jest可以测试坏JSON的异常,以及另一个正常的测试用于好的JSON数据。 - Steven Scott
2个回答

9

我通过添加一个辅助函数来解决这个问题,参考此处

const isJSON = (str:string) => {
    try {
        const json = JSON.parse(str);
        if (Object.prototype.toString.call(json).slice(8,-1) !== 'Object') {
        return false
        }
    } catch (e) {
        return false
    }
    return true
}

然后我能够做到这一点:
expect(isJSON(body)).toBe(true)

2
一个解析过的Json也可以包含一个数组。 - Aquazi

6
你可以简单地使用Jest的.not.toThrow()来断言JSON解析不会抛出错误。
这是一个我制作的例子,它断言一个对象可以被解析为有效的JSON:
it("Produces metadata object that can be parsed to valid JSON", () => {
    const meta = articleMetaData(article);

    const parseJson = () => {
        const json = JSON.stringify(meta);
        JSON.parse(json);
    };

    expect(parseJson).not.toThrow();
});

如果,例如,对象具有圆形结构:
var obj = {
  a: "foo",
  b: obj
}

测试将失败:

Expected the function not to throw an error.
Instead, it threw:
    TypeError: Converting circular structure to JSON

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接