【问题标题】:Jest failing with unhelpful error message when throwing new Error抛出新错误时开玩笑失败并显示无用的错误消息
【发布时间】:2020-06-22 10:44:24
【问题描述】:

我在我的代码中调用了这个函数并抛出了一个错误:

myFunction(message) {
    if (!message) {
        throw new Error('No Message')
    }
}

和测试:

it.only('should throw error if no message', () => {
   library.myFunction() // no message
   expect(global.opener.postMessage).not.toHaveBeenCalled()
})

但是 Jest 只是指向单词 new 并且测试失败,没有其他消息。我该如何解决这个问题?

【问题讨论】:

  • 您是否尝试过明确期望该调用会引发错误,请参阅jestjs.io/docs/en/expect#tothrowerror
  • @jonrsharpe 我也可以断言,但我只想断言我的函数没有被调用,我肯定可以这样做吗?
  • 你可以,但如果你想让测试保持运行,那么something's需要捕捉错误——可能是你,只是try/catch,或者它可能是 Jest 使用期望。
  • 啊好的。这就说得通了。我在另一个组件中发现了错误
  • 还有什么组件?在它进入测试功能之前?给minimal reproducible example

标签: javascript reactjs jestjs


【解决方案1】:

您的测试崩溃,而不是失败,因为myFunction 抛出的错误永远不会被捕获。对此有两种广泛的解决方案:

  1. 让 Jest 捕获它,使用内置的 toThrow 错误期望:

    it.only('should throw error if no message', () => {
        expect(() => library.myFunction()).toThrow()
        expect(global.opener.postMessage).not.toHaveBeenCalled()
    })
    

    请注意,在这种情况下,您需要将对 myFunction 的调用包装在一个函数中,以延迟执行,以便 Jest 可以处理错误(否则在调用 expect 之前会抛出错误,然后您就回来了相同的位置)。

  2. 自己动手,使用try/catch,并明确确保在测试期间达到一个期望:

    it.only('should throw error if no message', () => {
        expect.assertions(1)
        try {
            library.myFunction()
        catch (err) {
            expect(global.opener.postMessage).not.toHaveBeenCalled()
        }
    })
    

    没有expect.assertions,如果未来的更改意味着对library.myFunction 的调用不会引发错误,那么测试内部永远不会达到预期,它会默默通过。重要的是要确保通过测试的所有逻辑路径都符合预期,或者您明确检查是否达到了预期数量。

【讨论】:

  • 啊好吧,这是有道理的!我的测试通过了。我会查询您在上面所说的 1 件事““我的函数总是在引发错误之前被调用” - 什么?“”为什么这么令人困惑?我的函数被调用,然后如果条件为真,我会抛出一个错误。无论如何,其余的都是有道理的,所以会投票并标记为正确。请随意投票,这对我有帮助(我确实在 github 上的 jest 页面上看到了这个问题,似乎没有人找到一个很好的解决方案)
  • @RedBaron 如果“我的函数”是指 myFunction 那么是的,但这似乎是多余的——如果你从不调用它,当然什么也不会发生。所以我假设你的意思是 postMessage,你试图验证的函数没有被调用。此外,如果您在研究中发现某些内容,则应将其包含在您的问题中
  • 将更新,稍后我得到的问题。欢呼
猜你喜欢
  • 1970-01-01
  • 2019-07-01
  • 2021-07-22
  • 2013-07-07
  • 2021-07-13
  • 2018-09-27
  • 2020-12-22
  • 2018-07-20
  • 2019-11-01
相关资源
最近更新 更多