为什么jest测试给出失败并给出超时错误,但在参数切换时出现404错误?



我想开始在我的项目中结合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的文件夹中。

user.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;

方法本身在一个名为user.js的文件中,该文件位于controllers文件夹中。它看起来像这样

// @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和这里发生了什么,我会非常感激。

感谢

我弄明白了其实是别人帮我弄明白的。路由错误。处理步骤Jest不知道该跑哪条路线,当它找不到路线时就会超时。我的请求应该是这样写的

test('Create a new user', async () => {
const response = await request(app)
.post(`/api/v1/auth/register`)
.send({
name: 'alex',
email: 'a@gmail.com',
password: '1234567',
role: 'admin',
}).expect(201);
});

auth.js路由文件

const express = require('express');
const {register, login, getMe, getAllUser,forgotPassword, resetPassword, updateDetails, updatePassword} = require('../controllers/auth');
const { protect } = require('../middleware/auth');
const router = express.Router();
router.get('/allusers',getAllUser);
router.post('/register', register);
router.post('/login', login);
router.get('/me', protect, getMe);
router.post('/forgotPassword', forgotPassword);
router.put('/resetpassword/:resettoken', resetPassword);
router.put('/updatedetails', protect, updateDetails);
router.put('/updatepassword', protect, updatePassword);

module.exports = router;

相关内容

最新更新