Jest Node.js Невозможно вызвать до и после все правильно, используя отдельный файл - PullRequest
0 голосов
/ 10 января 2020

Я определил beforAll и afterAll в отдельном файле bootstrap.js, но я не могу провести интеграционное тестирование. Я использую стек без сервера. Я получил помощь от github, но этот пример был написан на языке мокко, поэтому я пытался преобразовать его в шутку.

bootstrap.js

beforeAll(async () => {
    console.log('[Tests Bootstrap] Start');

    await startSlsOffline((err) => {
        if (err) {
            console.log(err);
        }

        console.log('[Tests Bootstrap] Done');
    });
}, 30000);

afterAll(async () => {
    console.log('[Tests Teardown] Start');

    await stopSlsOffline();

    console.log('[Tests Teardown] Done');
});

handler.test.js

describe('get Endpoints', () => {
    const server = request(`http://localhost:3005`);
    test('should run get example', async () => {
        const res = await server.get('/example');
        console.log('res', res.body);
    });
});

Моя шутливая конфигурация

module.exports = {
    verbose: true,
    bail: true,
    coverageDirectory: 'output/coverage/jest',
    setupFilesAfterEnv: [ './bootstrap.js' ]
};

Вывод, который я получаю

> jest --config test/jest.config.js

 FAIL  test/handler.test.js
  get Endpoints
    ✕ should run get example (38ms)

  ● get Endpoints › should run get example

    connect ECONNREFUSED 127.0.0.1:3005



  console.log test/bootstrap.js:6
    [Tests Bootstrap] Start

  console.log test/bootstrap.js:30
    Serverless: Offline started with PID : 5587 and PORT: 3005

  console.log test/bootstrap.js:18
    [Tests Teardown] Start

  console.log test/bootstrap.js:47
    Serverless Offline stopped

  console.log test/bootstrap.js:22
    [Tests Teardown] Done

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        2.825s
Ran all test suites.
npm ERR! Test failed.  See above for more details.

Ответы [ 2 ]

1 голос
/ 10 января 2020

Глобальная настройка не работает так, как вы ожидаете. Если вы видите журналы, ваши журналы beforeAll поступают после выполнения теста. Вы должны использовать другой способ установки и вывода. Jest имеет концепцию globalSetup и globalTeardown, и я думаю, что она подходит лучше в вашем случае. В рамках этого вы можете запускать и останавливать свой сервер. Конфиг будет выглядеть так

Подробнее здесь - https://jestjs.io/docs/en/configuration#globalsetup -строка

module.exports = {
    verbose: true,
    bail: true,
    coverageDirectory: 'output/coverage/jest',
    globalSetup: "./bootstrap.js",
    globalTeardown: "./bootstrap.js"
};

И ваш bootstrap будет выглядеть так

const { spawn} = require('child_process');

let slsOfflineProcess;

module.exports = async () => {
    console.log('[Tests Bootstrap] Start');
    await startSlsOffline((err) => {
        if (err) {
            console.log(err);
        }

        console.log('[Tests Bootstrap] Done');
    });
}

const startSlsOffline = (done) => {
    if (slsOfflineProcess) {
        slsOfflineProcess.kill('SIGINT');
        console.log('Serverless Offline stopped');
        done();
    }

    slsOfflineProcess = spawn('sls', [ 'offline', 'start', '--port', 3005 ]);

    console.log(`Serverless: Offline started with PID : ${slsOfflineProcess.pid} and PORT: 3005`);

    slsOfflineProcess.stdout.on('data', (data) => {
        if (data.includes('Offline listening on')) {
            console.log(data.toString().trim());
            done();
        }
    });

    slsOfflineProcess.stderr.on('data', (errData) => {
        console.log(`Error starting Serverless Offline:\n${errData}`);
        done(errData);
    });
};

0 голосов
/ 18 января 2020

Я решил свою проблему, используя этот конфиг с помощью 1-го ответа, используя globalSetup и globalTeardown.

Подробнее здесь - https://jestjs.io/docs/en/configuration#globalsetup -строка

bootstrap.js

const { spawn } = require('child_process');

let slsOfflineProcess;

module.exports = async () => {
    console.log('[Tests Bootstrap] Start');
    await startSlsOffline().catch((e) => {
        console.error(e);
        return;
    });
    global.__SERVERD__ = slsOfflineProcess;
};

function startSlsOffline() {
    slsOfflineProcess = slsOfflineProcess = spawn('sls', [ 'offline', 'start', '--port', 3005 ]);

    return finishLoading();
}

const finishLoading = () =>
    new Promise((resolve, reject) => {
        slsOfflineProcess.stdout.on('data', (data) => {
            if (data.includes('Serverless: Offline [HTTP] listening on')) {
                console.log(data.toString().trim());
                console.log(`Serverless: Offline started with PID : ${slsOfflineProcess.pid}`);
                resolve('ok');
            }

            if (data.includes('address already in use')) {
                reject(data.toString().trim());
            }
        });

        slsOfflineProcess.stderr.on('data', (errData) => {
            console.log(`Error starting Serverless Offline:\n${errData}`);
            reject(errData);
        });
    });

teardown.js
module.exports = async function() {
    let slsOfflineProcess = global.__SERVERD__;
    slsOfflineProcess.stdin.write('q\n');
    slsOfflineProcess.stdin.pause();
    await slsOfflineProcess.kill('SIGINT');
    console.log('Serverless Offline stopped');
};

Найти образец на этом ссылка здесь: https://github.com/bilalsha/sls-test-jest

PS globalTeardown не работает, если тест не пройден. Я опубликую решение, как только оно у меня будет.

...