【问题标题】:Express API Test with Jest and Mongoose使用 Jest 和 Mongoose 进行快速 API 测试
【发布时间】:2018-12-23 05:00:22
【问题描述】:

我正在使用 mongoose 连接到 MongoDB 的快速 API 服务器。

node 启动 index.js,它启动一个 app.js,我在其中进行 MongoDB 设置和快速设置。

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

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,它没有对其进行任何事务作为测试的一部分。 (正如另一个问题所说)。

最后在那个例子中,他们试图在测试本身中调出 mongoose db。我将它作为应用程序启动的一部分来启动(当我在 dev 中运行路由时它会起作用)。

【问题讨论】:

标签: node.js mongodb jestjs


【解决方案1】:
 "scripts": {
        "test": "jest  --watchAll --detectOpenHandles --forceExit"
      }

在 package.json 中你可以重写测试脚本。

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 2019-05-23
    • 2019-04-26
    • 1970-01-01
    • 2019-08-07
    • 2021-07-16
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    相关资源
    最近更新 更多