Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.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 未处理的Promisejection警告测试承诺拒绝_Javascript_Node.js_Promise_Jasmine_Jasmine Node - Fatal编程技术网

Javascript 未处理的Promisejection警告测试承诺拒绝

Javascript 未处理的Promisejection警告测试承诺拒绝,javascript,node.js,promise,jasmine,jasmine-node,Javascript,Node.js,Promise,Jasmine,Jasmine Node,我正在尝试编写一个jasmine测试,它有一个间谍。和.returnValues承诺列表。前几次承诺是拒绝,最后一次是成功。当测试顺利通过时,Node会抱怨以下问题: 未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:2):未定义 未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:3):未定义 未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:4):未定义 PromisejectionHandledWarn

我正在尝试编写一个jasmine测试,它有一个间谍
。和.returnValues
承诺列表。前几次承诺是拒绝,最后一次是成功。当测试顺利通过时,Node会抱怨以下问题:

未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:2):未定义
未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:3):未定义
未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:4):未定义
PromisejectionHandledWarning:承诺拒绝已异步处理(拒绝id:2)
PromisejectionHandledWarning:承诺拒绝已异步处理(拒绝id:3)
PromisejectionHandledWarning:承诺拒绝已异步处理(拒绝id:4)
我的代码非常直截了当:我创建了一个间谍,将其注入到我的代码中,调用我的代码,该代码将循环调用我的间谍,直到它不拒绝为止,然后监视它被调用了5次。间谍是这样的:

var spy=jasmine.createSpy(“spy”).and.returnValue(
承诺。拒绝(),
承诺。拒绝(),
承诺。拒绝(),
承诺。拒绝(),
承诺。决心(真实)
);
//注入间谍。。。
//只有当它调用的承诺返回函数在不拒绝的情况下解析时,才会解析此问题。
myFunc()
.然后(()=>{
预期(间谍)。被催促的时间(5);
完成();
})
.catch();
被测代码的链中最后一个是空的
.catch()
,以验证我没有造成问题。问题是,Node看到我在做
Promise.reject()
,认为这是未处理的,而事实上,这是已处理的


如何正确测试被拒绝的承诺?我觉得我需要类似于Jasmine的东西。

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

解决办法是:

var unsafeReject=p=>{
p、 捕获(忽略=>忽略);
返回p;
};
var p=承诺。拒绝(“将导致警告”);
//将捕获队列上的拒绝,而不是堆栈上的拒绝
设置超时(
()=>p.catch(e=>console.log(“拒绝:”,e))
);
var q=未被拒绝对象(承诺、拒绝(“不会引起警告”);
设置超时(
()=>q.catch(e=>console.log(“拒绝:”,e))

);
为什么不使用
async await
,将
await
包装在
try..catch..finally
块中,然后在
finally
块中执行
expect(spy).tohavebeencledtimes(5)
;我在节点6上,不支持
async/await
。你的意思是
safeReject
?@Bergi正确,实际上名称是错误的,应该是
unassereject
,因为传入的承诺在被拒绝时不会在控制台中“爆炸”,但仍然可以被返回的承诺捕获。我将其重命名为
unassereject
我想我会使用
handled(Promise.reject(…)
handledRejection(…)
。我不会使用“安全”的术语,因为拒绝(不炸毁任何东西)是安全的还是安全的是不明确的,因为你不能错过拒绝。