我想开始在我的项目中使用Jest进行测试,但是我很难让这个测试工作。当我运行它时,我抛出了这个错误。
thrown: "Exceeded timeout of 5000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."
5 |
6 |
> 7 | test('Create a new user', async()=>{
| ^
8 |
9 | await request(app).post('/').send({
10 | name:'alex',
at Object.test (tests/user.test.js:7:1)
测试文件中的代码如下所示
const app = require('../app');
const usersRoute = require('../routes/users');
const request = require('supertest');
test('Create a new user', async()=>{
await request(app).post('/').send({
name:'alex',
email:"a@gmail.com",
password:"1234567",
role:"admin"
}).expect(201);
})
我的app.js文件如下所示
const express = require("express");
const colors = require('colors');
const errorHandler = require('./middleware/error');
const morgan = require('morgan');
const localdb = require('./db/bootcampDB');
const fileupload = require('express-fileupload');
const path = require('path');
const cookieParser = require('cookie-parser');
//ROUTES
const reviews = require('./routes/reviews');
const auth = require('./routes/auth')
const bootcamps = require('./routes/bootcamps');
const courses = require('./routes/courses')
const users = require('./routes/users');
const app = express();
app.use(express.json())
if(process.env.NODE_ENV === 'development'){
app.use(morgan('dev'));
}
localdb();
app.use(fileupload())
//SET static folder
app.use(express.static(path.join(__dirname, 'public')));
app.use('/api/v1/bootcamps', bootcamps);
app.use('/api/v1/courses', courses);
app.use('/api/v1/auth', auth);
app.use('/api/v1/users', users);
app.use('/api/v1/reviews', reviews);
app.use(cookieParser);
app.use(errorHandler)
module.exports = app;
server.js文件
const app = require('./app');
const port = process.env.PORT || 4000
const server = app.listen(port, ()=>{
console.log(`Server running in ${process.env.NODE_ENV} mode on port ${port}`.yellow.bold);
})
process.on('unhandledRejection',(err, promise)=>{
console.log(`Error: ${err.message}`.red);
//Close server
server.close(()=>{
process.exit(1)
})
})
这个特定的测试需要通过“/api/v1/users”路径,如下所示
router.route('/').get(advancedResults(User), getUsers).post(createUsers);
这行代码位于名为uses.js的文件中,该文件位于名为routes的文件夹中。
用户. js文件
const express = require('express');
const {getUsers,getSingleUsers,createUsers, deleteUsers, updateUsers} = require('../controllers/users');
const User = require('../models/user');
const router = express.Router({mergeParams:true});
const {protect, authorize} = require('../middleware/auth')
const advancedResults = require('../middleware/advancedResults');
router.use(protect);
router.use( authorize('admin'))
router.route('/').get(advancedResults(User), getUsers).post(createUsers);
router.route('/:id').get(getSingleUsers).put(updateUsers).delete(deleteUsers);
module.exports = router;
方法本身位于controllers文件夹中名为user.js的文件中。
// @desc Create user
// @route POST /api/v1/auth/users
// @access Private/Admin
exports.createUsers = asynHandler(async(req, res, next)=> {
const user = await User.create(req.body)
res.status(201).json({success:true, data: user})
});
我所做的一件事就是改变传递给请求的内容,例如,如果我传入'/api/v1/users'
,我没有得到定时错误,我得到了这个错误
expected 201 "Created", got 404 "Not Found"
12 | password:"1234567",
13 | role:"admin"
> 14 | }).expect(201);
| ^
15 |
16 | })
17 |
at Object.expect (tests/user.test.js:14:8)
----
at Test._assertStatus (node_modules/supertest/lib/test.js:252:14)
at node_modules/supertest/lib/test.js:308:13
at Test._assertFunction (node_modules/supertest/lib/test.js:285:13)
at Test.assert (node_modules/supertest/lib/test.js:164:23)
at localAssert (node_modules/supertest/lib/test.js:120:14)
at node_modules/supertest/lib/test.js:125:7
at Test.fn [as callback] (node_modules/superagent/src/node/index.js:924:3)
at IncomingMessage.callback (node_modules/superagent/src/node/index.js:1153:18)
这让我更加困惑,因为我以为我告诉程序创建数据,而不是找到它。如果有人能帮助我理解Jest和这里发生的事情,我将非常感激。
谢谢
2条答案
按热度按时间qhhrdooz1#
看起来您没有在
app.js
中启动应用程序,请尝试添加:并指定已执行测试的完整路径(使用
afterAll
回调在测试结束时关闭服务)。最后,如果需要向受保护的路由发送令牌,可以使用
set
:gmol16392#
我发现其实是别人帮我发现的。错误在路由中。Jest不知道该运行哪条路由,当它找不到路由时就会超时。我的请求应该这样写
auth.js路由文件