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)
我已经使用setupFilesAfterEnv和testEnvironment以及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)
归档时间: |
|
查看次数: |
1531 次 |
最近记录: |