Передача броска с использованием шутки и супертеста

#node.js #aws-lambda #jestjs #supertest

Вопрос:

Я пытаюсь обработать случай использования исключений с помощью супертеста и шутки для данного кода. Я перепробовал много вещей, но не смог найти решение.

 var serverless = require('serverless-http');
import express from 'express';

const app = express();
app.use(express.json());

app.post('/post', async (req, res) => {

    try {
        // Get user from dynamodb
        const id = 'random-user-id';
        const user = await DynamoDb.Scan({
            TableName: 'user_table',
            FilterExpression: 'id = :id',
            ExpressionAttributeValues: {
                ':id': id,
            },
        }).catch(async (err) => {
            throw err;
        });

        console.log('user', user);
        return res.status(200).send();

    } catch (exception) {
        // Trying to handle this
        throw exception;
    }

});

module.exports.handler = serverless(app);

 

Тестовый случай

 test("should throw error on failing to get user from database", async () => {

    mockScan.mockImplementation(() => {
        return {
            promise() {
                return Promise.reject({});
            },
        };
    });

    const response = await request
        .post(`/post`)
        .send();
});
 

При запуске теста он застревает и приводит к

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

Комментарии:

1. Вы не можете справиться с этим, это фундаментальная проблема в коде вашего сервера — есть необработанное отклонение обещания, которое не приводит ни к какому ответу, запрос просто зависает. См., например expressjs.com/en/advanced/… для исправлений.