用Jest和Mongoose进行Express API测试

时间:2018-07-15 12:30:53

标签: node.js mongodb jestjs

我正在使用Mongoose连接到MongoDB来快速地在API服务器上工作。

节点启动index.js,这会启动一个app.js,在其中执行MongoDB安装和快速安装。

在正常开发中效果很好,但是当我尝试使用jest测试API时,猫鼬在测试完成后完成连接时遇到了问题,因此jest给了我以下错误。

  

测试运行一秒钟后,Jest没有退出。

     

这通常意味着有些异步操作不是   在测试中停止了。考虑使用   --detectOpenHandles来解决此问题。

我从逻辑上知道这是由于node.js的异步特性引起的。我只是不知道如何解决。我不知道该解决方案是否正在重组我运行电话的方式或做有承诺的事情(我仍然很薄弱)。

那么我该如何解决此问题? 下面发布了App.js,并更改了连接字符串以供公开发布。

app.js

import express from 'express';
import path from 'path';
import logger from 'morgan';
import bodyParser from 'body-parser';
import cors from 'cors';
import mongoose from 'mongoose';
import fs from 'fs';

//Bring DB Online
console.log("Brining MongoDB Online")
mongoose.set('debug', true)

const devurl = 'mongodb://mlabuname:mlabpass@ds247170.mlab.com:47170/devdb'
mongoose.connect(devurl, { useNewUrlParser:true }, function() {
  console.log('\tMongoDB - Connection has been made');
})
.catch(err => {
    console.error('\tApp starting error:', err.stack);


  process.exit(1);
});

//Load Models
console.log("\tLoading Mongoose Models")
import User from './models/user'
import Wiki from './models/wiki'

//Express Items
console.log("Brining Express Online")
const app = express();
app.disable('x-powered-by');
app.use(cors());

// View engine setup
app.set('views', path.join(__dirname, '../views'));
app.set('view engine', 'pug');

app.use(logger('dev', {
  skip: () => app.get('env') === 'test'
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, '../public')));

// Routes
// Dynamic routes setup by controllers
console.log("\tInstalling Controller Routes")
fs.readdirSync("src/controllers").forEach(function (file) {
  if(file.substr(-3) == ".js") {
    const route = require("./controllers/" + file)
    route.controller(app)
  }
})

// Temp ResetDB Route for DEV.
console.log("\tInstalling ResetDB Route")
import resetDB from './routes/resetDB'
app.use('/resetDB', resetDB);

// Default Routes set by the framework, fine for now.
console.log("\tInstalling Default")
import defaultRoutes from './routes/defaultRoutes'
app.use('/', defaultRoutes);

// Catch 404 and forward to error handler
app.use((req, res, next) => {
  const err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// Error handler
app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars
  res
    .status(err.status || 500)
    .render('error', {
      message: err.message
    });
});

export default app;

更新 我已经指出这是重复的。我看到了这个答案,但问题并不完全相同。首先,他们实际上是在测试模型。在这种情况下,我不是。我只是试图在快速路线上运行测试,并且在测试运行(并通过)后显示错误。

所有正在发生的事情是系统正在桥接MongoDB,它没有在测试中对其进行任何事务。 (正如其他问题所述)。

最后,在该示例中,他们试图在测试本身中启动猫鼬数据库。我将其作为应用程序启动的一部分进行桥接(因为当我在开发人员中运行路由时,它就起作用了。)

1 个答案:

答案 0 :(得分:0)

 "scripts": {
        "test": "jest  --watchAll --detectOpenHandles --forceExit"
      }

在package.json中,您可以重新编写测试脚本。