开玩笑测试异步功能失败

时间:2020-06-18 11:17:52

标签: typescript async-await jestjs

我有一个简单的打字稿功能,只打印一些文本并进入睡眠状态。测试完成,无需等待异步函数返回。

这是我的职责。

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有关吗?如何在测试中解决此问题?谢谢。

2 个答案:

答案 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()完成。