Jest, как проверить экспресс-запрос API POST? - PullRequest
0 голосов
/ 22 января 2019

Мне нужно проверить, правильно ли работает мой POST-запрос к моей конечной точке с помощью Jest-теста. У меня была идея сначала получить счетчик моей таблицы служб (я использую sequelize orm), затем отправить новый пост-запрос и, наконец, получить новый счетчик и сравнить, будет ли старый счет + 1 равен новому счету. Если true, то запрос POST работает просто отлично.

test('Create a valid Service', async (done) => {
const service = {
    name: "cool",
    description: "description"
};

await Service.count().then(async function (count) {

    await request(app)
        .post('/api/services')
        .send(service)
        .then(async () => {
            await Service.count().then(function (newcount) {
                expect(newcount).toBe(count + 1);
            });
        })
        .catch(err => console.log(`Error ${err}`));
});

});

Для меня тест выглядит нормально, но когда я его запускаю, я получаю:

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

Чего-то не хватает или есть даже лучший способ проверить POST-запрос? с шуткой?

1 Ответ

0 голосов
/ 22 января 2019

Это потому, что вы не вызываете обратный вызов done , переданный в функции обратного вызова jest. Это можно сделать так.

test('Create a valid Service', async(done) => {
    const service = {
        name: "cool",
        description: "description"
    };

    await Service.count().then(async function (count) {

        await request(app)
            .post('/api/services')
            .send(service)
            .then(async() => {
                await Service.count().then(function (newcount) {
                    expect(newcount).toBe(count + 1);
                    // execute done callback here
                    done();
                });
            })
            .catch(err => {
                // write test for failure here
                console.log(`Error ${err}`)
                done()
            });
    });
});

Вы также можете написать этот код таким образом, чтобы улучшить читабельность и максимально использовать async / await .

test('Create a valid Service', async(done) => {
    const service = {
        name: "cool",
        description: "description"
    };
    try {
        const count = await Service.count();
        await request(app).post('/api/services').send(service)
        const newCount = await Service.count()
        expect(newCount).toBe(count + 1);
        done()
    } catch (err) {
        // write test for failure here
        console.log(`Error ${err}`)
        done()
    }
});

По умолчанию Jest также разрешает обещание в асинхронном / ожидающем случае . Мы можем добиться этого без функции обратного вызова также

test('Create a valid Service', async() => {
    const service = {
        name: "cool",
        description: "description"
    };
    try {
        const count = await Service.count();
        await request(app).post('/api/services').send(service)
        const newCount = await Service.count()
        expect(newCount).toBe(count + 1);
    } catch (err) {
        // write test for failure here
        console.log(`Error ${err}`)
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...