开玩笑如何在字符串上测试JSON.parse会成功

时间:2018-03-27 08:55:56

标签: javascript json typescript api jestjs

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

如果我这样做:

{{1}}

并且API没有返回JSON,然后我得到类似的东西:

  

SyntaxError:位于0的JSON中的意外标记p       在JSON.parse()

我的测试失败了,而不是在测试中出错。

我可以做的开玩笑测试是什么;
是我收到的可解析为有效JSON的字符串吗?

2 个答案:

答案 0 :(得分:6)

我通过添加一个帮助函数解决了这个问题,我找到了here

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)

答案 1 :(得分:1)

您可以简单地使用Jest's .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