如何在 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.jsontestdata/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()
    ];

看看下面的相关帮助。