【问题标题】:Setup mongoose connection in custom Jest test environment在自定义 Jest 测试环境中设置猫鼬连接
【发布时间】:2018-08-26 14:29:57
【问题描述】:

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

jest.config.js

module.exports = {
    testEnvironment: './mongo-environment'
}

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

example.spec.js

const mongoose = require('mongoose')

describe('test', () => {
  it('connection', () => {
    expect(mongoose.connection.readyState).toBe(1)
  })
})

【问题讨论】:

  • 我一直在看同样的东西,但我认为它不会起作用。 Jest 通过重置全局环境在“沙箱”中运行每个测试套件,以防止副作用污染其他测试。我还没有找到确切的原因,但结果是你在mongo-environment.jsexample.spec.js 中获得了新的Mongoose 单例。他们无法共享连接。

标签: node.js mongoose jestjs


【解决方案1】:

我已经使用 setupFilesAfterEnvtestEnvironmentglobal 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;

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

jest.config.js:

module.exports = {
setupFilesAfterEnv : ['./setup-unitTest-db.js']
}

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();
})

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

// this goes in your test suite
/**
 * @jest-environment ./nodeWithMongo
 */

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多