如何在 chai mocha 中恢复 mongo
How to restore mongo in chai mocha
所以我想在测试开始前恢复 mongo 数据库。 我这样做:
const app = require("../app");
const chai = require("chai");
const mongoose = require("mongoose");
const User = require('../models/users');
const Region = require('../models/regions');
const testUsers = require('../testdata/users.json');
const testRegions = require('../testdata/regions.json');
describe('Restoring database', function () {
before(function(done) {
var promises = [
User.deleteMany().exec()
,Region.deleteMany().exec()
];
console.log('Cleaned database');
done();
});
before(function(done) {
testUsers.users.forEach(element => {
var ObjectId = mongoose.Types.ObjectId;
element._id = new ObjectId(element._id);
var newUser = new User(element);
newUser.save(function (err, result) {
if (err) {
console.log("err:",err);
}
});
});
console.log('Users added');
done();
});
before(function(done) {
testRegions.regions.forEach(element => {
var newRegion = new Region(element);
newRegion.save(function (err, result) {
if (err) {
console.log("err:",err);
}
});
});
console.log('Regions added');
done();
});
testdata/users.json
和 testdata/regions.json
是包含 key/pair 值的简单 json 文件。
这个好看吗? 当我运行
npm test
它没有给出任何错误。在控制台中我看到了这个:
Restoring database
Cleaned database
Users added
Regions added
但是当我查看数据库时,我得到了不同的结果。 有时一切看起来都很好。所有行都在集合中。 有时其中一个集合中缺少几行。 有时其中一个集合是空的。
这是一个非常奇怪的行为。
我还尝试将 "newUser" 和 "newRegion" 添加到变量 "promises" 中,而不是直接执行它们。 但我仍然得到这些奇怪的结果。
怎么回事?
问题是由于 done()
在 异步 statements/promises 完成之前被调用 。
使用 async/await 或使用 Promises 并且只在异步 statements/promises 完成时调用 done()
。
例如:
没有 done()
调用,因为我们使用 await
语句将等到每个语句完成后再继续:
before(async function() {
let userResult = await User.deleteMany();
let regionResult = wait Region.deleteMany();
console.log('Cleaned database');
});
或者使用 done()
和承诺:
before(function(done) {
User.deleteMany()
.then(result => {
console.log('Cleaned database');
done();
});
});
您之前示例中的语法根本没有添加 Promise,它只是将这些函数添加到一个数组中:
var promises = [
User.deleteMany().exec()
,Region.deleteMany().exec()
];
看看下面的相关