开玩笑由于Mongoose.model无法关闭

时间:2018-07-02 11:29:08

标签: node.js unit-testing testing mongoose jestjs

我正在尝试开玩笑地创建我的第一个测试。

user_model_test.js

const mongoose = require('mongoose')
const User = require('../user_model')


describe('user model tests', () => {
  beforeAll( async () => {
    await mongoose.connect('mongodb://localhost/supertest21')
  })
  afterAll( async () => { 
    await mongoose.connection.close()
  })

  it("has a module", () => {
    expect(User).toBeDefined()
  })
})

user_model.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema

const userSchema = new Schema({
  username: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  }
})

const User = mongoose.model('User', userSchema, 'user')

module.exports = User

运行测试时,以--detectOpenHandles运行时,出现此错误:

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

  ●  PROMISE

      17 | })
      18 |
    > 19 | const User = mongoose.model('User', userSchema, 'user')
         |                       ^
      20 |
      21 | module.exports = User

      at Function.init (node_modules/mongoose/lib/model.js:970:16)
      at Mongoose.Object.<anonymous>.Mongoose.model (node_modules/mongoose/lib/index.js:396:11)
      at Object.<anonymous> (libs/user/user_model.js:19:23)
      at Object.<anonymous> (libs/user/__tests__/user_model_test.js:3:14)

我知道这与mongoose.model初始化有关。当我将第4个参数传递给mongoose.model时,要跳过初始化,则不会出现promise错误,但测试永远不会关闭并且不会显示更多错误。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

使用安装文件和setupFilesAfterEnv

Jest可以调用“ setup.js”文件来运行某些beforeAllafterAll函数。当正在进行的Mongoose连接保持Jest打开时,我们将使用afterAll挂钩将其关闭。

解决方案

  1. 在您的jest.config.js中,添加以下几行:
setupFilesAfterEnv: [
  '<rootDir>/tests/setup.js', // <- Feel free to place this file wherever it's convinient
],

  1. 使用以下代码创建setup.js文件:
import { getMongoDBInstance } from '../src/bin/server.ts';

afterAll(async () => {
  const mongoDB = getMongoDBInstance();

  await mongoDB.connection.close();
});

这里,getMongoDBInstance是一个函数,该函数将在我的服务器启动时向我返回实例化的Mongoose实例。

let mongoDB;

async function initServer() {
  ...
  await mongoose.connect(uristring, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  });

  mongoDB = mongoose;
  ...
}

export const getMongoDBInstance = () => mongoDB;

现在,在完成所有测试之后,Jest将调用此函数并关闭任何MongoDB连接!您可以按照相同的方法来解决与knex或任何其他节点ORM的打开连接。

答案 1 :(得分:-2)

尝试将await mongoose.connection.close()更改为await mongoose.disconnect();。为我工作。