Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 如何在Jest中跟踪失败的异步测试?_Javascript_Unit Testing_Asynchronous_Promise_Jestjs - Fatal编程技术网

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是正常的,不应该导致此错误,因此是的,问题是
调用
。这就是未处理的弹出侦听器可以变得方便的地方。顺便说一句,有承诺支持的访问,不需要承诺,