jest test asyn c сбой функции - PullRequest
0 голосов
/ 18 июня 2020

У меня есть простая функция машинописного текста, которая просто печатает текст и спит. Тест завершился, не дожидаясь возврата функции asyn c.

Это моя функция.

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».

Каркас проекта создается из приложения create-react-app с опцией typescript. В моем проекте есть эти зависимости.

  "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 ]

2 голосов
/ 18 июня 2020

Тест не должен ждать выполнения асинхронной задачи, потому что он синхронный. Jest завершает работу раньше, потому что ему нечего ждать, это можно отладить с помощью опции detectOpenHandles .

Jest поддерживает обещания для асинхронных тестов, это должно быть:

test('sleep test', async () => {
    await delayedGreeting();
    ...
});
1 голос
/ 18 июня 2020

Ваш тест вызывает delayedGreeting(), который печатает Hello, затем запускает асинхронную операцию и возвращает. Оператор await работает должным образом, только если функция, которая его использует, является самой await -ed (и т. Д.).

Jest не ждет завершения потока asyn c, потому что никто не сказал

Вы можете переместить функции 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().

...