我有一个简单的打字稿功能,只打印一些文本并进入睡眠状态。测试完成,无需等待异步函数返回。
这是我的职责。
test('sleep test', () => {
function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function delayedGreeting() {
console.log('Hello');
await sleep(5000);
console.log('World!');
await sleep(5000);
console.log('Goodbye!');
}
delayedGreeting();
});
测试仅在控制台中以“ Hello”结束。
我尝试了该网站https://www.sitepoint.com/delay-sleep-pause-wait/建议的其他表格。我的测试总是以仅打印“ Hello”结束。
项目的框架是通过带有typescript选项的create-react-app生成的。 我的项目中有这些依赖项。
"dependencies": {
"@types/node": "^12.12.47",
"@types/react": "^16.9.38",
"@types/react-dom": "^16.9.8",
"@types/zeromq": "^4.6.3",
"protobuf-typescript": "^6.8.8",
"react": "^16.13.1",
"react-dom": "^16.13.1",
"react-scripts": "3.4.1",
"typescript": "^3.7.5",
"zeromq": "^6.0.0-beta.6"
},
"devDependencies": {
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.5.0",
"@testing-library/user-event": "^7.2.1",
"@types/jest": "^24.9.1",
"@typescript-eslint/eslint-plugin": "^3.3.0",
"@typescript-eslint/parser": "^3.3.0",
"eslint-config-prettier": "^6.11.0",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.20.0",
"prettier": "^2.0.5"
},
然后我使用npm test
进行测试。
这与Jest有关吗?如何在测试中解决此问题?谢谢。
答案 0 :(得分:2)
该测试不应该等待异步任务,因为它是同步的。玩笑会提早退出,因为它没有什么可等待的,可以使用detectOpenHandles选项进行调试。
为异步测试开玩笑supports promises,应该为:
test('sleep test', async () => {
await delayedGreeting();
...
});
答案 1 :(得分:1)
您的测试调用delayedGreeting()
打印Hello
,然后开始异步操作并返回。 await
语句只有在使用await
本身(依此类推)的函数中才能正常工作。
Jest没有等待您的异步流完成,因为没有人告诉它这样做。
您可以将sleep()
和delayedGreeting()
函数移到测试之外,以使测试更易于阅读。
function sleep(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function delayedGreeting() {
console.log('Hello');
await sleep(5000);
console.log('World!');
await sleep(5000);
console.log('Goodbye!');
}
使测试工作最简单的方法是将测试实现函数声明为async
,并使其为await delayedGreeting()
:
test('sleep test', async () => {
await delayedGreeting();
});
通过这种方式,Jest知道它必须等待等待delayedGreeting()
的测试函数,而该测试函数又要等待Promise
的两次调用返回的两个sleep()
完成。