Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jest在抛出新错误时失败,并显示无用的错误消息_Javascript_Reactjs_Jestjs - Fatal编程技术网

Javascript Jest在抛出新错误时失败,并显示无用的错误消息

Javascript Jest在抛出新错误时失败,并显示无用的错误消息,javascript,reactjs,jestjs,Javascript,Reactjs,Jestjs,我在代码中调用此函数并抛出一个错误: 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.to

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

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()
})
it.only('should throw error if no message', () => {
    expect.assertions(1)
    try {
        library.myFunction()
    catch (err) {
        expect(global.opener.postMessage).not.toHaveBeenCalled()
    }
})
但是Jest只是指向单词
new
,测试失败了,没有其他消息。我怎样才能解决这个问题

您的测试正在崩溃,而不是失败,因为从未捕获到由
myFunction
引发的错误。有两种广泛的解决方案:

  • 让Jest捕捉它,使用内置的错误预期:

    it.only('should throw error if no message', () => {
        expect(() => library.myFunction()).toThrow()
        expect(global.opener.postMessage).not.toHaveBeenCalled()
    })
    
    请注意,在这种情况下,您需要将对
    myFunction
    的调用包装到函数中,以延迟执行,以便Jest可以处理错误(否则,在调用
    expect
    之前抛出错误,您将返回相同的位置)

  • 使用
    try
    /
    Catch
    ,亲自捕捉它,并明确确保在测试期间达到一个预期:

    it.only('should throw error if no message', () => {
       library.myFunction() // no message
       expect(global.opener.postMessage).not.toHaveBeenCalled()
    })
    
    it.only('should throw error if no message', () => {
        expect.assertions(1)
        try {
            library.myFunction()
        catch (err) {
            expect(global.opener.postMessage).not.toHaveBeenCalled()
        }
    })
    
    如果将来的更改意味着对
    library.myFunction
    的调用没有抛出错误,那么在测试中就永远不会达到预期,它会自动通过。确保通过测试的所有逻辑路径都有期望值,或者显式检查是否达到了期望值,这一点很重要

  • 您的测试正在崩溃,而不是失败,因为从未捕获到由
    myFunction
    引发的错误。有两种广泛的解决方案:

  • 让Jest捕捉它,使用内置的错误预期:

    it.only('should throw error if no message', () => {
        expect(() => library.myFunction()).toThrow()
        expect(global.opener.postMessage).not.toHaveBeenCalled()
    })
    
    请注意,在这种情况下,您需要将对
    myFunction
    的调用包装到函数中,以延迟执行,以便Jest可以处理错误(否则,在调用
    expect
    之前抛出错误,您将返回相同的位置)

  • 使用
    try
    /
    Catch
    ,亲自捕捉它,并明确确保在测试期间达到一个预期:

    it.only('should throw error if no message', () => {
       library.myFunction() // no message
       expect(global.opener.postMessage).not.toHaveBeenCalled()
    })
    
    it.only('should throw error if no message', () => {
        expect.assertions(1)
        try {
            library.myFunction()
        catch (err) {
            expect(global.opener.postMessage).not.toHaveBeenCalled()
        }
    })
    
    如果将来的更改意味着对
    library.myFunction
    的调用没有抛出错误,那么在测试中就永远不会达到预期,它会自动通过。确保通过测试的所有逻辑路径都有期望值,或者显式检查是否达到了期望值,这一点很重要


  • 你有没有尝试过显式地期望调用抛出错误,请看@jornsharpe我也可以断言,但是我想断言我的函数没有被调用,当然我可以这样做?你可以,但是如果你想让测试继续运行,那么需要捕获错误-可能是你,只要尝试/捕获,或者它可以是用期望来开玩笑。啊,好的。这是有道理的。我捕捉到另一个组件中的错误,但考虑到另一个组件是什么?在它到达测试函数之前?给出一个例子。你是否尝试过显式地期望调用抛出错误,请参见@jonrsharpe我也可以断言,但我想断言我的函数没有被调用,我当然可以这样做?你可以,但是如果你想让测试继续运行,那么需要捕获错误-可能是你,只要尝试/捕获,或者它可以是用期望来开玩笑。啊,好的。这是有道理的。我捕捉到另一个组件中的错误,但考虑到另一个组件是什么?在它到达测试函数之前?给我一个答案。啊,好吧,这是有道理的!我的测试也通过了。我会质疑你上面说的一件事“我的函数总是在抛出错误之前被调用”-什么?”“为什么这么令人困惑?我的函数被调用了,然后如果条件为真,我抛出一个错误。不管怎样,其余的都是有意义的,所以会向上投票并标记为正确。请随意向上投票,这对我有帮助。”(我确实在github的jest页面上看到了这个问题,似乎没有人找到真正好的解决方案)@RedBaron if by“我的函数”"你指的是myFunction是的,但这似乎是多余的——如果你从不调用它,当然什么都不会发生。所以我假设你指的是postMessage,你试图验证的函数不会被调用。另外,如果你在研究中发现了什么,你应该在你的问题中包括它。当我有了妈妈后,这个问题会更新我会质疑你上面说的一句话“我的函数总是在抛出错误之前被调用”——什么“为什么这么令人费解?我的函数被调用,然后如果条件为真,我抛出一个错误。不管怎样,其余的都有意义,所以将upvote标记为正确。请随意upvote这个问题,它会帮助我解决(我确实在github的jest页面上看到了这个问题,似乎没有人找到真正好的解决方案)@RedBaron if by”“我的职能"你指的是myFunction是的,但这似乎是多余的——如果你从不调用它,当然什么都不会发生。所以我假设你指的是postMessage,你试图验证的函数不会被调用。另外,如果你在研究中发现了什么,你应该在你的问题中包括它。当我有了妈妈后,这个问题会更新再见,干杯