当前位置: 首页 > 知识库问答 >
问题:

UnhandledPromiseRejectionWarning测试promise拒绝

华景明
2023-03-14

我正在尝试编写一个jasmine测试,它有一个间谍, 是一个许诺列表。前几次承诺是拒绝,最后一次是成功。虽然测试顺利通过,但Node抱怨如下:

UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): undefined
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): undefined
UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): undefined
PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 2)
PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 3)
PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 4)

我的代码非常直接:我创建一个间谍,将它注入到我的代码中,调用我的代码,这将循环调用我的间谍直到它不拒绝,然后监视它被调用了5次。间谍是这样的:

var spy = jasmine.createSpy("spy").and.returnValues(
    Promise.reject(),
    Promise.reject(),
    Promise.reject(),
    Promise.reject(),
    Promise.resolve(true)
);

// Inject the spy...

// This will resolve only when the Promise-returning function it calls resolves without rejecting.
myFunc()   
    .then(() => {
        expect(spy).toHaveBeenCalledTimes(5);
        done();
    })
    .catch();

被测试的代码在它的链中最后一个空的 来验证我没有引起那里的问题。AFICT,问题是Node看到我在执行 ,并认为这是未处理的,而实际上它是被处理的。

如何正确测试被拒绝的承诺?我觉得我需要这样的东西给茉莉。

共有1个答案

杨志强
2023-03-14

这是因为您在事件队列稍后的某个地方捕获被拒绝的承诺,而不是在创建承诺的同一个调用堆栈中。

解决办法是:

null

var unsafeReject = p => {
  p.catch(ignore=>ignore);
  return p;
};

var p = Promise.reject("will cause warning");

//will catch reject on queue, not on stack
setTimeout(
  ()=>p.catch(e=>console.log("reject:",e))
);

var q = unsafeReject(Promise.reject("will NOT cause warning"));
setTimeout(
  ()=>q.catch(e=>console.log("reject:",e))
);
 类似资料:
  • 我有一些mocha/chai/chai-http测试,它们遵循下面的结构,但是,每当一个测试失败时,我会得到一个 ,我似乎不知道它的来源。 UnhandledPromiserEjectionWarning:未处理的承诺拒绝。此错误可能是由于不带catch块的异步函数内部引发的,或者是由于拒绝了未用。catch()处理的承诺。 我尝试在 后面添加一个 承诺.reject(err)/code>,但也不

  • 我正在使用Firebase云消息服务辅助角色处理后台推送通知。 当通知(其中包含一些数据的URL)被点击,我想要么: 焦点窗口,如果它已经在所需的URL 导航到URL并聚焦它,如果已经有一个活动的选项卡打开 如果上述条件都不满足,则打开URL的新窗口 点1和3与下面的SW代码一起工作。 出于某种原因,第2点不起作用。promise被拒绝,原因是: 我认为这可能是由于缺少https,但从我的阅读来看

  • 我试图用chai-as-promedied,Mocha和“should”方言测试一个被拒绝的承诺的细节。承诺由蓝鸟来实现。 这很好用: 该错误有一个“Status”属性。我想断言状态是401 这不起作用: 似乎任何不引用“rejectedWith”或rejectedWith(Error)的断言尝试都将失败,并且只是将错误输出到控制台。 如何深究被拒的原因?

  • 所以,我在测试一个依赖于事件发射器的组件。为此,我想出了一个解决方案,使用mocha+chai的承诺: 在控制台上,我得到了一个“unhandledPromiserEjectionWarning”,尽管reject函数正在被调用,因为它会立即显示消息“assertionError:Promise Error" (Node:25754)UnhandledPromiseRejectionWarning

  • 我在想什么时候我该拒绝一个promise。我发现了几个关于这个话题的问题,但找不到合适的答案。我什么时候应该拒绝promise? 本文http://howtonode.org/6666a4b74d7434144cff717c828be2c3953d46e7/promises 说: 解析:一个成功的promise是“已解析”的,它调用正在等待的成功侦听器,并记住为附加的未来成功侦听器解析的值。分辨率

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请