gpt4 book ai didi

node.js - 使用 Jest 和 Mongoose 进行 Express API 测试

转载 作者:太空宇宙 更新时间:2023-11-04 01:46:17 25 4
gpt4 key购买 nike

我正在使用 mongoose 连接到 MongoDB,以 Express 方式开发 API 服务器。

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

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

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with --detectOpenHandles to troubleshoot this issue.

从逻辑上我知道这是由于 Node.js 的异步特性造成的。我只是不知道如何解决它。我不知道解决方案是否是重组我运行调用的方式或用 promise 做一些事情(我仍然很弱)。

那么我该如何解决这个问题呢?下面发布了 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 数据库。我将其作为应用程序启动的一部分进行启动(因为当我在开发中运行路由时它会起作用)。

最佳答案

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

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

关于node.js - 使用 Jest 和 Mongoose 进行 Express API 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51348395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com