使用Jest测试时出现jest-jasmine2 Env.js未处理错误求助
解决Jest测试中Mongoose保存操作的未处理错误
嘿,我一眼就看出问题出在哪了——你在Promise.all里的map回调没有返回emp.save()生成的Promise!这就导致Promise.all根本没在等这些保存操作完成,而这些异步操作抛出的错误也没被任何代码捕获,所以Jest才会弹出这些未处理错误提示。
具体修改方案
把你Manager.js里的这段代码:
var employeeData = Promise.all(employees.map(function(emp) { emp.save(); }));
改成下面这样(关键是加上return):
var employeeData = Promise.all(employees.map(function(emp) { return emp.save(); }));
或者用更简洁的箭头函数写法:
const employeeData = Promise.all(employees.map(emp => emp.save()));
为什么这样能解决问题?
emp.save()是异步操作,会返回一个Promise对象,但你的原代码里map回调没有把这个Promise返回出去,所以employees.map()最终生成的是一个全是undefined的数组。Promise.all需要接收一个Promise数组,当你传入的是undefined数组时,它会立刻resolve结束,但那些emp.save()的异步操作还在后台跑着。一旦其中某个保存操作抛出错误,因为没有任何catch块去处理这个错误,就会触发Jest的未处理错误日志。- 至于你的测试看起来能通过,是因为测试的Promise链已经走完了,而后台保存操作的错误是在测试结束后才抛出来的,所以才会出现“测试通过但报错”的矛盾情况。
另外提个小建议:你测试代码里的catch块现在只是打印错误,要是真的出现断言失败或者其他错误,expect.assertions(3)会因为没执行够3个断言而直接失败,你可以考虑在catch里加上throw e,这样能更清晰地看到测试失败的原因。
内容的提问来源于stack exchange,提问作者Alex Wang
相关产品推荐
相关产品推荐

