Javascript 仅使用async/await测试库findBy*查询

Javascript 仅使用async/await测试库findBy*查询,javascript,testing-library,Javascript,Testing Library,从文档中,findBy查询返回一个承诺。但是,如果将这些查询与async/await+try…catch一起使用,那么将它们与Promise.prototype.catch()一起使用似乎不起作用 例如,“未找到”按预期记录在此处: const { screen } = require('@testing-library/dom'); beforeAll(() => { document.body.innerHTML = ` <header></header

从文档中,
findBy
查询返回一个承诺。但是,如果将这些查询与async/await+try…catch一起使用,那么将它们与
Promise.prototype.catch()一起使用似乎不起作用

例如,“未找到”按预期记录在此处:

const { screen } = require('@testing-library/dom');

beforeAll(() => {
  document.body.innerHTML = `
    <header></header>
  `;
});

test('DOM', async () => {
  try {
    await screen.findByRole('aaaaa');
    console.log('found');
  } catch {
    console.log('not found');
  }
});

这有什么原因吗?

你的两个例子并不相同。语句
screen.findByRole('aaaaaa')
不在承诺内。将函数设置为async将把函数包装成承诺。然后,应该编写与async await等价的代码,如下所示

我对代码进行了修改,以处理函数返回错误类型的情况,以及处理“在承诺中抛出错误…”的要求

///我添加了伪造的实现只是为了说明
让屏幕={
findByRole:
()=>新承诺((解决、拒绝)=>设置超时(
()=>{拒绝(新错误('TheError'))}
,2000
))
}
//您可以在上面注释和取消注释以测试不同的场景
//let screen={findByRole:()=>新错误('The Error')}
//let screen={findByRole:()=>5}
功能测试(描述,功能)
{
func()
}
/////
测试('DOM',()=>{
新承诺(
(解决、拒绝)=>{
让结果=screen.findByRole('aaaaa')
错误的结果实例?拒绝(结果):解决(结果)
})
.然后(()=>{
console.log('found');
})
.catch((e)=>{
console.log('未找到并捕获错误:'+e.message);
});

});您只需返回
承诺
,以便您的测试框架(可能是Jest)知道等待测试完成。否则Jest无法知道此测试是异步的,使用
async
关键字隐式返回一个
Promise

const{screen}=require('@testinglibrary/dom');
测试('DOM',()=>{
返回屏幕。findByRole('aaaaa')
.然后(()=>{
console.log('found');
})
.catch(()=>{
console.log('notfound');
});
});

不幸的是,此代码不会产生相同的输出。将resolve()更改为reject(),但这会发生,因为reject()不是findByRole()。我认为调用screen.findByRole('aaaaaa')会产生一个您无法捕获的异常。我测试了我的代码,它运行正常。这是误会吗?也许你是说。。。返回承诺中的错误,而不是您编写的“在承诺中抛出错误将导致拒绝”。这仅适用于
screen.findByRole
的自定义实现同步抛出。
@testing library/dom
的默认实现在1000毫秒后拒绝。还值得注意的是,您的conditional
resolve
reject
将永远不会被调用,因为它上面的行抛出了一个代码无法处理的错误(例如使用try/catch)。@apikosir抛出异步的东西将是不可能捕获的。即使使用异步/等待。您最终接受了您说它没有捕获错误的代码。我认为将此标记为答案会误导其他看到它的人。我认为虽然这是一个很好的提示,但答案与承诺捕获的问题无关。除非我认为是这样,因为OP不会返回承诺,在错误有机会被捕获和记录之前,Jest环境会被破坏。使用我的解决方案可以解决这个问题。我怀疑您在case screen.findByRole('aaa')中的示例是否会引发异常,它将在您写入日志“not found”的捕获中被捕获。问题是解释为什么它没有被捕获。。。我认为你的代码甚至还没有被捕获。那么无论如何,试试看:)我已经试过了。。。但它没有抓住。你可以编辑你的例子,就像我用一个假的抛出,看看你是否得到一个干净的“未找到”。
test('DOM', () => {
  screen.findByRole('aaaaa')
    .then(() => {
      console.log('found');
    })
    .catch(() => {
      console.log('not found');
    });
});