Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 如何在玩笑中正确使用承诺和计时器_Javascript_Async Await_Jestjs_Settimeout_Es6 Promise - Fatal编程技术网

Javascript 如何在玩笑中正确使用承诺和计时器

Javascript 如何在玩笑中正确使用承诺和计时器,javascript,async-await,jestjs,settimeout,es6-promise,Javascript,Async Await,Jestjs,Settimeout,Es6 Promise,我搜索了SO和Google,找到了很多类似的问题和答案,但似乎没有一个能帮我解决问题 我试图编写一些需要模拟异步轮询函数的测试用例。但无论我做什么,我都会得到: 在jest.setTimeout.timeout指定的5000ms超时内未调用异步回调 我设置了一些最小的测试用例来重现问题: jest.useFakeTimers(); 描述('计时器测试',()=>{ 它('普通定时器按预期工作',()=>{ const mock=jest.fn(); 设置超时(模拟,5000); jest.run

我搜索了SO和Google,找到了很多类似的问题和答案,但似乎没有一个能帮我解决问题

我试图编写一些需要模拟异步轮询函数的测试用例。但无论我做什么,我都会得到:

在jest.setTimeout.timeout指定的5000ms超时内未调用异步回调

我设置了一些最小的测试用例来重现问题:

jest.useFakeTimers();
描述('计时器测试',()=>{
它('普通定时器按预期工作',()=>{
const mock=jest.fn();
设置超时(模拟,5000);
jest.runAllTimers();
expect(mock).tohavebeincall();
});
它('使用计时器模拟承诺解析会导致jest超时错误',async()=>{
const mock=jest.fn(()=>{
返回新承诺((resolve)=>setTimeout(resolve,500));
});
const handler=jest.fn();
等待mock()。然后(处理程序);
jest.runAllTimers();
expect(handler).tohavebeencall();
});
它('使用计时器模拟承诺拒绝会导致jest超时错误',async()=>{
const mock=jest.fn(()=>{
返回新承诺((resolve,reject)=>setTimeout(reject,500));
});
const handler=jest.fn();
等待mock().catch(处理程序);
jest.runAllTimers();
expect(handler).tohavebeencall();
});
});

有人能解释一下我做错了什么以及为什么吗?

因此,通过@Bergi的后续评论,我重申了
done
实际上也没有必要。我只是需要重新订购一些东西。然后,我在测试承诺链时遇到了类似的问题,这些承诺链进一步强调了这一点,因此我添加了一些案例

jest.useFakeTimers();
描述('计时器测试',()=>{
它('使用普通计时器工作正常',()=>{
const mock=jest.fn();
设置超时(模拟,5000);
jest.runAllTimers();
expect(mock).tohavebeincall();
});
它('使用计时器模拟承诺解析',异步()=>{
const mock=jest.fn(()=>{
返回新承诺((resolve)=>setTimeout(resolve,500));
});
const handler=jest.fn();
const actual=mock()。然后(处理程序);
jest.runAllTimers();
等待实际结果;
expect(handler).tohavebeencall();
});
它('使用计时器模拟承诺拒绝',异步()=>{
const mock=jest.fn(()=>{
返回新承诺((resolve,reject)=>setTimeout(reject,500));
});
const handler=jest.fn();
const actual=mock().catch(处理程序);
jest.runAllTimers();
等待实际结果;
expect(handler).tohavebeencall();
});
它('使用计时器模拟承诺解析->延迟->解析链',异步()=>{
const mockA=jest.fn(()=>{
返回承诺。解决();
});
const mockB=jest.fn(()=>{
返回新承诺((解决、拒绝)=>{
设置超时(解析,500);
});
});
const handler=jest.fn();
常量实际值=mockA()
.然后(()=>{
常量mockProm=mockB();
jest.runAllTimers();
返回mockProm;
})
.然后(处理人);
jest.runAllTimers();
等待实际结果;
expect(moka).tohavebeincall();
expect(mockB).tohavebeincall();
expect(handler).tohavebeencall();
});
它('使用计时器模拟承诺解析->延迟->拒绝链',异步()=>{
const mockA=jest.fn(()=>{
返回承诺。解决();
});
const mockB=jest.fn(()=>{
返回新承诺((解决、拒绝)=>{
设置超时(拒绝,500);
});
});
const handler=jest.fn();
常量实际值=mockA()
.然后(()=>{
常量mockProm=mockB();
jest.runAllTimers();
返回mockProm;
})
.捕获(处理程序);
等待实际结果;
expect(moka).tohavebeincall();
expect(mockB).tohavebeincall();
expect(handler).tohavebeencall();
});
});

@Bergi的评论让我找到了解决方案。我最终使用了
done
函数,并删除了
wait
。这似乎至少在这个最小的测试用例中有效

jest.useFakeTimers();
描述('计时器测试',()=>{
它('普通定时器按预期工作',()=>{
const mock=jest.fn();
设置超时(模拟,5000);
jest.runAllTimers();
expect(mock).tohavebeincall();
});
它('使用计时器模拟承诺解析会导致jest超时错误',异步(完成)=>{
const mock=jest.fn().mock实现(()=>{
返回新承诺((resolve)=>setTimeout(resolve,500));
});
//使处理程序调用完成以替换等待
const handler=jest.fn(完成);
mock().then(handler);
jest.runAllTimers();
expect(handler).tohavebeencall();
});
它('使用计时器模拟承诺拒绝会导致jest超时错误',异步(完成)=>{
const mock=jest.fn().mock实现(()=>{
返回新承诺((resolve,reject)=>setTimeout(reject,500));
});
//使处理程序调用完成以替换等待
const handler=jest.fn(完成);
mock().catch(处理程序);
jest.runAllTimers();
expect(handler).tohavebeencall();
});
});

调用
jest.runAllTimers()
等待后
无法work@Bergi在调用
mock
之前,它也不能工作,因为在调用
mock
之前没有超时,对吗?您可能需要执行类似
const promise=mock()的操作;jest.runAllTimers();等待承诺