Javascript 如何在Jest中跟踪失败的异步测试?
-更新- 已确定问题。 在实际的代码库中,断言被传递给导入的回调,一旦回调在测试失败的情况下执行,就会引发承诺拒绝 因此,这接近于测试的实际编写方式:Javascript 如何在Jest中跟踪失败的异步测试?,javascript,unit-testing,asynchronous,promise,jestjs,Javascript,Unit Testing,Asynchronous,Promise,Jestjs,-更新- 已确定问题。 在实际的代码库中,断言被传递给导入的回调,一旦回调在测试失败的情况下执行,就会引发承诺拒绝 因此,这接近于测试的实际编写方式: description(“文件系统”),()=>{ 它(“应该检查文件是否存在”,async()=>{ 调用(异步()=>{ const received=等待文件存在(); 预期常数=真; 预期(已收到)。托比(预期); }); }); }); 复杂回调以一种更简单的方式呈现,以产生相同的问题: 导出函数调用(回调){ 回调(); } -
description(“文件系统”),()=>{
它(“应该检查文件是否存在”,async()=>{
调用(异步()=>{
const received=等待文件存在();
预期常数=真;
预期(已收到)。托比(预期);
});
});
});
复杂回调以一种更简单的方式呈现,以产生相同的问题:
导出函数调用(回调){
回调();
}
-更新- 以下代码有效。 为了更好的可见性,我从一个大的代码库中提取了一小部分代码。如果我只运行下面的代码,它将按预期工作。我认为实际的代码库中存在一个问题 @Flask建议集中处理未处理的承诺拒绝,这为问题增加了很大的价值
考虑以下测试:
import fileExists,{call}来自“/exists”;
描述(“文件系统”,()=>{
它(“应该检查文件是否存在”,async()=>{
const received=等待文件存在();
预期常数=真;
预期(已收到)。托比(预期);
});
});
用于以下来源:
从“fs”导入fs,{constants};
从“util”导入{promisify};
导出默认异步函数fileExists(){
const path=“.nonexistent”;
const access=promisify(fs.access);
试一试{
等待访问(路径,constants.F_OK);
}抓住{
返回false;
}
返回true;
}
当fileExists
拒绝返回false
时,将按预期收到未处理的PromisejectionWarning
。但这无助于跟踪失败测试的来源
对于同步测试,Jest显示测试路径(即,文件系统›应检查文件是否存在
),这有助于跟踪失败测试的来源
对于异步测试,实现这一点的最佳方法是什么?
未处理PromisejectionWarning
。它并不等同于失败的测试,因为如果断言通过,它不会阻止测试通过。这意味着代码编写方式错误,包含未经约束的承诺
只有在测试中省略了wait
时,才会发生这种情况:
fileExists(); // no await
或fileExists
函数包含松散的未处理承诺:
fileExists() {
whatever() // no return
.then(() => {
whatever() // no return
}) // no catch to suppress errors
}
在设置文件中设置以下文件是一个很好的做法:
process.on('unhandledRejection', console.error);
它提供了比未处理PromisejectionWarning更有用的输出,并允许基于错误堆栈调试问题。该问题特定于未显示的fileExists。添加了源代码。谢谢。:-)请检查添加到问题的来源。谢谢。:-)fileExists是正常的,不应该导致此错误,因此是的,问题是调用
。这就是未处理的弹出侦听器可以变得方便的地方。顺便说一句,有承诺支持的访问,不需要承诺,