JEST Received函数没有抛出,但抛出了HTTPError

r8xiu3jd  于 2023-10-14  发布在  Jest
关注(0)|答案(1)|浏览(150)

我正在用JEST和Got测试一个端点。403 Forbidden错误下面的代码打印catch块中的错误,并失败,因为相同的调用没有引发错误。为什么?为什么?

try {
        response = await api(`verify/${profile.auth.verifyToken}`, {method: 'POST'}).json();
    } catch (e) {
        console.log(e);
    }
    expect(async () => {
        response = await api(`verify/${profile.auth.verifyToken}`, {method: 'POST'}).json();
    }).toThrow();

输出量:

console.log test/api.int.test.js:112
HTTPError: Response code 403 (Forbidden)
    at EventEmitter.<anonymous> (C:\dev\mezinamiridici\infrastructure\node_modules\got\dist\source\as-promise.js:118:31)
    at processTicksAndRejections (internal/process/task_queues.js:97:5) {
  name: 'HTTPError'
}

Error: expect(received).toThrow()
Received function did not throw

这个变种也不起作用:

expect(() => api(`verify/${profile.auth.verifyToken}`, {method: 'POST'})).toThrow();

顺便说一句,当HTTPError被抛出而没有被捕获时,没有堆栈跟踪,我看不到错误被抛出的位置。如果还有其他错误,我会准确地看到哪个测试线负责。为什么?为什么?

s6fujrry

s6fujrry1#

expect(...).toThrow()用于检查函数调用是否抛出错误。当调用一个pwdc函数时,它永远不会抛出错误;相反,它返回一个Promise,* 可能 * 最终会变成“rejected”。尽管promise函数使用相同的throw/catch术语,但检测抛出的错误所需的代码与检测拒绝的Promise所需的代码不同。这就是为什么Jest需要不同的Assert技术。
试试expect(...).rejects.toThrow()

await expect(api(`verify/${profile.auth.verifyToken}`, {method: 'POST'}).json())
  .rejects.toThrow();

请注意,您必须await这个Assert,因为Jest需要等到Promise完成后才能看到它是被解析还是被拒绝。

相关问题