JEST с Express не заканчивается - PullRequest
3 голосов
/ 12 апреля 2020

Я начал писать тесты с приложением Jest of (nano) express. Тест запускает сервер с beforeAll() и закрывает его с afterAll(). Я вижу, что код выполняется, но процесс JEST не заканчивается.

test. js

test('end to end test', async () => {
    const polls = await axios.get(`http://localhost:3000/bff/polls/last`);
    console.log(polls.data);
    expect(polls.data).toBeDefined();
});

beforeAll(() => {
    app.listen(3000, '0.0.0.0')
        .then(r => logger.info("Server started"));
});

afterAll(() => {
    if (app.close())
        logger.info("Server stopped");
});

Вывод из npm run test

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        5.625s
Ran all test suites.
Jest did not exit one second after the test run has completed.
This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.

Когда я запускаю с jest --config jest.config.js --detectOpenHandles, тест также не завершается sh, но ошибки нет, и мне все равно нужно его убить.

Полный исходный код есть: https://github.com/literakl/mezinamiridici/blob/master/infrastructure/test/api.int.test.js

Я тестировал отдельно вне тестов, что nano express завершит процесс вызовом app.close(). Так что это связано с JEST.

Обновление: то же поведение с обещаниями

test('end to end test', () => {
    const polls = axios.get(`http://localhost:3000/bff/polls/last`);
    return expect(polls).resolves.toBeDefined();
});

Обновление:

Здесь вы можете найти минимальное воспроизводимое хранилище: https://github.com/literakl/nano-options.git

Я перешел с Ax ios на Got JS, и проблема все еще есть. Когда я сейчас запускаю тест с помощью npm run test из командной строки, он завершается с:

Timeout - Async callback was not invoked within the 20000ms timeout specified by jest.setTimeout.Timeout - Async callback was not invoked within the 20000ms timeout specified by jest.setTimeout.Error

Когда я запускаю тест из WebStorm, ошибки не возникает, но процесс продолжает выполняться.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

ОБНОВЛЕНИЕ

Первоначально я думал, что это проблема, связанная с winston , но кажется, что для jest testEnvironment должно быть установлено значение node в Для правильной работы Ax ios используйте адаптер axios/lib/adapters/http. Вы можете проверить связанную проблему здесь "обнаружить jest и использовать http адаптер вместо XMLhttpRequest" .

  1. Установить testEnvironment: 'node' внутри jest.config.js.
  2. Обновить create user тест для запуска функции обратного вызова done в конце:
describe("user accounts", () => {
    test('create user', async (done) => {
        // let response = await axios.get(`${API}/users/1234`);
        let response = await axios.get(`${API}/users/1234`, getAuthHeader()); // TODO error with Authorization header

        expect(response.data.success).toBeTruthy();
        expect(response.data.data).toBeDefined();
        let profile = response.data.data;
        expect(profile.bio.nickname).toMatch("leos");
        expect(profile.auth.email).toMatch("leos@email.bud");

        // Call done here to let Jest know we re done with the async test call
        done();
    });
});
0 голосов
/ 18 апреля 2020

Причиной root был открытый дескриптор клиента mongodb. Как я его нашел?

1) установить библиотеку leakes-handle

npm install leaked-handles --save-dev

2) импортировать ее в свой тест

require("leaked-handles");

3) вывод

tcp handle leaked at one of:
    at makeConnection (infrastructure\node_modules\mongodb\lib\core\connection\connect.js:274:20)
tcp stream {
  fd: -1,
  readable: true,
  writable: true,
  address: { address: '127.0.0.1', family: 'IPv4', port: 54963 },
  serverAddr: null
}

Если вы не можете найти причину root, вы можете явно убить JEST с помощью

jest --config jest.config.js --runInBand --forceExit
...