簡體   English   中英

用Jest和Mongoose進行Express API測試

[英]Express API Test with Jest and Mongoose

我正在使用mongoose連接到MongoDB來快速地在API服務器上工作。

節點啟動index.js,這將啟動一個app.js,在其中執行MongoDB安裝和快速安裝。

在正常的開發中工作正常,但是當我嘗試使用jest測試API時,貓鼬在測試完成后完成了連接的問題,因此jest給了我以下錯誤。

測試運行一秒鍾后,Jest沒有退出。

這通常意味着您的測試中沒有停止異步操作。 考慮使用--detectOpenHandles運行Jest來解決此問題。

從邏輯上我知道這是由於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中運行路由時,它可以正常工作)。

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

在package.json中,您可以重新編寫測試腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM