在自定义 Jest 测试环境中设置猫鼬连接

kat*_*nci 5 mongoose node.js jestjs

我正在尝试设置一个自定义 Jest 测试环境,我可以在测试开始运行之前连接到数据库一次,并在所有测试完成后断开连接。我想避免在每个测试文件中使用辅助函数beforeAll()afterAll()钩子。下面是我当前设置的样子。当我运行测试时,它失败了,因为 readyState 为 0,代表已断开连接。我错过了什么?

开玩笑的配置文件

module.exports = {
    testEnvironment: './mongo-environment'
}
Run Code Online (Sandbox Code Playgroud)

mongo-environment.js

const mongoose = require('mongoose')
const NodeEnvironment = require('jest-environment-node')

class MongoEnvironment extends NodeEnvironment {
  constructor (config) {
    super(config)
  }

  async setup () {
    await this.setupMongo()
    await super.setup()
  }

  async teardown () {
    await this.teardownMongo()
    await super.teardown()
  }

  runScript (script) {
    return super.runScript(script)
  }

  setupMongo () {
    return new Promise((resolve, reject) => {
      mongoose.connect('mongodb://localhost/test')
        .then(mongoose => {
          const db = mongoose.connection

          Promise
            .all(Object.keys(db.collections).map(name => db.dropCollection(name)))
            .then(resolve)
            .catch(reject)
        })
        .catch(reject)
    })
  }

  teardownMongo () {
    return mongoose.disconnect()
  }
}

module.exports = MongoEnvironment
Run Code Online (Sandbox Code Playgroud)

例子.spec.js

const mongoose = require('mongoose')

describe('test', () => {
  it('connection', () => {
    expect(mongoose.connection.readyState).toBe(1)
  })
})
Run Code Online (Sandbox Code Playgroud)

Sou*_*rno 2

我已经使用setupFilesAfterEnvtestEnvironment以及global object的组合来实现此目的。

设置您的数据库连接并将 URL 存储在您的 custom-environment.js 中的全局对象中:(请参阅 Jest 文档了解 deets )

// my-custom-environment
const NodeEnvironment = require('jest-environment-node');
const { MongoMemoryServer } = require('mongodb-memory-server');

class CustomEnvironment extends NodeEnvironment {
  constructor(config, context) {
    super(config, context);
    this.testPath = context.testPath;
    this.docblockPragmas = context.docblockPragmas;
    this.db = {}
  }

  async setup() {
    await super.setup();
    this.db = await MongoMemoryServer.create()
    this.global.MONGO_URI = this.db.getUri()
  }

  async teardown() {   
    await this.db.stop()
    await super.teardown();
  }

  getVmContext() {
    return super.getVmContext();
  }

}

module.exports = CustomEnvironment;
Run Code Online (Sandbox Code Playgroud)

在设置环境后将运行的设置文件中,配置猫鼬以连接到您之前设置的全局 URI。

笑话.config.js:

module.exports = {
setupFilesAfterEnv : ['./setup-unitTest-db.js']
}
Run Code Online (Sandbox Code Playgroud)

setup-unitTest-db.js :

 require('dotenv').config();

const mongoose = require('mongoose');

const mongooseConfig = { useNewUrlParser: true, domainsEnabled: true, useUnifiedTopology: true  }

mongoose
    .connect( global.MONGO_URI, mongooseConfig)
    .then(() => {
        mongoose.set('useFindAndModify', false)
    })

afterAll (async () => {
    await mongoose.connection.dropDatabase();
    await mongoose.connection.close();
})
Run Code Online (Sandbox Code Playgroud)

最后,通过在测试文件顶部添加文档块来提供环境文件的完整路径,告诉 Jest 使用自定义测试环境文件:

// this goes in your test suite
/**
 * @jest-environment ./nodeWithMongo
 */
Run Code Online (Sandbox Code Playgroud)