使用@shelf/jest-mongodb编写MongoDB的Jest测试报错如何解决
问题原因分析
- 全局MongoDB环境变量未注入:
@shelf/jest-mongodb预设需要配套根目录下的配置文件才能正常启动内存MongoDB实例,很多用户会遗漏该配置,导致global.__MONGO_URI__和global.__MONGO_DB_NAME__两个全局变量未被注入,连接时读取到undefined值就会触发match方法调用报错。 - API调用错误:MongoDB 4.x版本中只有
MongoClient连接实例有close方法,db实例本身没有该方法,你写的await db.close()本身就是无效调用。 - 版本兼容问题:你当前使用的
@shelf/jest-mongodb@2.x对mongodb@4.x的支持存在缺陷,容易出现实例启动失败的问题。
修复步骤
- 在项目根目录新增
jest-mongodb-config.js配置文件,内容如下:
module.exports = { mongodbMemoryServerOptions: { instance: { dbName: 'jest' }, binary: { version: '4.0.3', // 可和你本地使用的MongoDB大版本保持一致 skipMD5: true }, autoStart: false } };
- 调整
db.test.js代码,修正无效调用:
const {MongoClient} = require('mongodb'); describe('insert', () => { let connection; let db; beforeAll(async () => { if (!global.__MONGO_URI__) { throw new Error('MongoDB测试实例未正常启动,请检查配置'); } // MongoDB 4.x默认开启useNewUrlParser,无需额外传参 connection = await MongoClient.connect(global.__MONGO_URI__); db = connection.db(global.__MONGO_DB_NAME__); }); afterAll(async () => { // 仅关闭连接实例即可,无需调用db.close await connection.close(); }); it('should insert a doc into collection', async () => { const users = db.collection('users'); const mockUser = {_id: 'some-user-id', name: 'John'}; await users.insertOne(mockUser); const insertedUser = await users.findOne({_id: 'some-user-id'}); expect(insertedUser).toEqual(mockUser); }); });
- 如果调整后仍报错,可使用兼容版本组合:删除
node_modules和package-lock.json,将package.json的依赖调整为以下版本后重新执行npm install即可。
{ "scripts": { "test": "jest" }, "devDependencies": { "@shelf/jest-mongodb": "^3.0.0", "jest": "^28.0.0" }, "dependencies": { "mongodb": "^4.13.0" }, "jest": { "preset": "@shelf/jest-mongodb" } }
内容的提问来源于stack exchange,提问作者learningtech
相关产品推荐
相关产品推荐

