модульное тестирование - шутка с супертестом дает время ожидания - PullRequest
0 голосов
/ 26 ноября 2018

Я получил ошибку при выполнении моих модульных тестов.Я использую экспресс-приложение от NodeJS.Я хочу проверить возвращаемое сообщение (200) и (в конечном итоге) вывод функции.

const {Router} = require('express');
const {query} = require('../dbConfig');

module.exports = (router = new Router()) => {
    //get only one user from the id
    router.post('/getUser', async (req,res)=>{
        id = req.body.id;
        sql = "SELECT lastname, firstname, email, title_id, id, state FROM users WHERE id=" + id;
        let result = await query(sql);
        if(result.length >= 1){
            res.send(result[0]);
        }

    })
    return router;
};

Но когда я пытаюсь запустить следующий тест:

const app = require('../../app')
const request = require('supertest')
jest.mock('../../dbConfig');;

describe('POST /getUser', () => {
    let data = {
        id:1
    }

    it('Response 200 + response type',(done)=>{
        request.agent(app)
            .post('/getUser')
            .send(data)
            .expect(200, done)
    })
});

Возвращаетмне следующая ошибка

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

я пробовал разные варианты без успеха ... я также пробовал документ в Интернете, который не очень помог для этой ошибки ... я запускаю шут с npx jest и макетфайл выглядит так:

const rep={
    "lastname": "admin",
    "firstname": "admin",
    "email": "admin@etsmtl.ca",
    "title_id": 1,
    "id": 1,
    "state": 1
};


const query = (sqli) =>{
    return new Promise((resolve, reject) =>{
        console.log("SQL request : " + sqli)
        if(sqli === "SELECT lastname, firstname, email, title_id, id, state FROM users WHERE id=1"){
            console.log("Passed")
            resolve(rep);
        }
    });

}

module.exports = {query};

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Ваш метод query возвращает объект (rep), и вы проверяете его длину в обработчике POST.Длина объекта undefined, поэтому он не достигает res.send.Вам нужно установить параметр else с другим res.send, чтобы он отвечал клиенту, что бы ни случилось.Кроме того, вы, вероятно, захотите изменить это значение if в обработчике POST или формат возврата в файле макета.

Например, в файле макета:

const query = (sqli) =>{
    return new Promise((resolve, reject) =>{
        console.log("SQL request : " + sqli)
        if(sqli === "SELECT lastname, firstname, email, title_id, id, state FROM users WHERE id=1"){
            console.log("Passed")
            resolve([rep]); //Now it's an array of length 1, reaches the first send
        } else {
            reject([]); //Length is 0, so it will reach the second send
        }
    });

}

Контроллер

if(result.length >= 1){
    res.send(result[0]);
} else {
    res.status(500).send('Something broke!');
}
0 голосов
/ 26 ноября 2018

Вы уверены, что ваша БД инициализирована?Можете ли вы попробовать это на вашем контроллере?

router.post('/getUser', async (req,res)=>{
    id = req.body.id;
    sql = "SELECT lastname, firstname, email, title_id, id, state FROM users WHERE id=" + id;
    try {
       let result = await query(sql);
       if(result.length >= 1){
           res.send(result[0]);
       } else {
           res.sendStatus(404);
       }
    } catch(err) {
       res.sendStatus(500)
    }

})

В случае, если ваша база данных неправильно инициализирована, или если запрос выдает ошибку, он никогда не ответит

...