我正在尝试开玩笑地创建我的第一个测试。
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错误,但测试永远不会关闭并且不会显示更多错误。有什么想法吗?
答案 0 :(得分:0)
setupFilesAfterEnv
Jest可以调用“ setup.js”文件来运行某些beforeAll
和afterAll
函数。当正在进行的Mongoose连接保持Jest打开时,我们将使用afterAll
挂钩将其关闭。
解决方案
jest.config.js
中,添加以下几行:setupFilesAfterEnv: [
'<rootDir>/tests/setup.js', // <- Feel free to place this file wherever it's convinient
],
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();
。为我工作。