单元测试 - 与 supertest 开玩笑会超时

unit testing - jest with supertest gives a timeout

我在单元测试中 运行 遇到错误。我正在使用 NodeJS 的 express 应用程序。我想测试 return 消息 (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)
    })
});

它return告诉我以下错误

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};

你确定你的数据库已经初始化了吗?你能在你的控制器上试试这个吗?

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)
    }

})

如果您的数据库未正确初始化,或者查询抛出错误,它将永远不会响应

您的 query 方法 return 是一个对象 (rep),您在 POST 处理程序中检查它的长度。对象的长度是undefined,所以没有达到res.send。您需要使用另一个 res.send 设置一个 else 选项,这样无论发生什么它都会回答客户端。此外,您可能想更改 POST 处理程序中的 if,或模拟文件中 return 的格式。

例如,在您的 Mock 文件中:

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!');
}