如何在Jest测试中模拟JSON.parse()函数

11

我的代码中有一个try/catch结构,当代码执行到catch部分时,会遇到JSON.parse()。

catch(err){
    JSON.parse(err.message)
}

代码可以正常运行,但是测试未通过。测试仅断言在try块中是否发生了某些事情。

try {
   popUp.method(mockedUrl)
}

这个测试只是断言该方法已被调用,但它失败了,因为在JSON.parse()阶段出现了错误。不知道如何存根来使其知道我传递给 JSON 的内容。


你可以参考这个链接:https://stackoverflow.com/questions/39193533/how-to-test-json-parse-in-jest - Miłosz
2
这很可能是XY问题。通常情况下,您需要模拟传递给JSON.parse的数据,而不是JSON.parse本身。 - Estus Flask
@estus 好的没错。但是当我在 catch 块中记录 err 时,它甚至什么都不显示。而当我使用 console.log('hello') 时,它会显示。这让我感到困惑。猜测它不知道 err 是什么。 - the venom
@Xanax正在使用sinon而不是jest。 - the venom
我不确定你的情况是什么。你是想为了测试目的还是调试目的来模拟它?你在哪里记录错误,以及错误可能不会显示出来的原因是什么?它是否是一个对象?JSON.parse(err.message)有什么作用?它似乎没有做任何事情。请发布你正在测试的代码和测试,这样你的情况就更清楚了。你可以像其他方法一样模拟JSON.parse,但这可能是错误的决定。 - Estus Flask
我需要模拟传递到 JSON.parse(thisNeedsMocking) 的内容,因为显然在 JSON 中有一个意外的标记。它正在解析我的错误消息,以便稍后可以对其进行处理。 - the venom
2个回答

22
你可以模拟JSON.parse实现
JSON.parse = jest.fn().mockImplementationOnce(() => {
  // return your what your code is returning.
});

一旦您不需要测试JavaScript内置对象JSON,那么这应该就足够了。因此,您可以从中返回代码所期望的内容,其他部分应该没有问题。


1
我无法评论,所以我会将这个作为第二个答案发布。对于那些在测试套件中使用它的人来说,这可能更好:
jest.spyOn(JSON, 'parse').mockImplementationOnce(...)

JSON.parse只被这种方式嘲笑一次。做

JSON.parse = jest.fn().mockImplementationOnce(...)

使得在第一次调用实现后,JSON.parse仍然保持模拟状态。

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