UnhandledPromiseRejectionWarning 测试承诺拒绝
UnhandledPromiseRejectionWarning Testing Promise Rejection
我正在尝试编写一个 jasmine 测试,其中有一个 .and.returnValues
承诺列表的间谍。前几个承诺是拒绝,最后一个是成功。虽然测试通过得很好,但 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();
被测代码的最后一个空链 .catch()
用于验证我没有在此处引起问题。 AFICT,问题是 Node 看到我在做 Promise.reject()
并认为那是未处理的,而事实上,它已被处理。
如何正确测试被拒绝的承诺?我觉得我需要 Jasmine 之类的东西 。
这是因为您在事件队列稍后的某处捕获了被拒绝的承诺,而不是在创建承诺的同一调用堆栈中。
一个解决方案是:
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))
);
我正在尝试编写一个 jasmine 测试,其中有一个 .and.returnValues
承诺列表的间谍。前几个承诺是拒绝,最后一个是成功。虽然测试通过得很好,但 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();
被测代码的最后一个空链 .catch()
用于验证我没有在此处引起问题。 AFICT,问题是 Node 看到我在做 Promise.reject()
并认为那是未处理的,而事实上,它已被处理。
如何正确测试被拒绝的承诺?我觉得我需要 Jasmine 之类的东西
这是因为您在事件队列稍后的某处捕获了被拒绝的承诺,而不是在创建承诺的同一调用堆栈中。
一个解决方案是:
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))
);