mongodb 为什么在切换参数时,jest测试会失败并给出超时错误,而不是404错误?

kgqe7b3p  于 2022-11-28  发布在  Go
关注(0)|答案(2)|浏览(93)

我想开始在我的项目中使用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和这里发生的事情,我将非常感激。
谢谢

qhhrdooz

qhhrdooz1#

看起来您没有在app.js中启动应用程序,请尝试添加:

const server = app.listen(8000, () => console.log('Server listening...'));

module.exports = { app, server };

并指定已执行测试的完整路径(使用afterAll回调在测试结束时关闭服务)。

const { app, server } = require('../app');
const usersRoute = require('../routes/users');
const request = require('supertest');

const base_path = 'http://localhost:8000';

describe('/api/v1/users', () => {

  afterAll(() => {
    server.close();
  })

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

最后,如果需要向受保护的路由发送令牌,可以使用set

await request(app)
  .post(<your-path>)
  .set('Authorization', <your-token>)
  .send({ ... })
  .expect(201);
gmol1639

gmol16392#

我发现其实是别人帮我发现的。错误在路由中。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;

相关问题