单元测试 - 与 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!');
}
我在单元测试中 运行 遇到错误。我正在使用 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!');
}