在运行Mocha测试之前删除MongoDB数据库

在运行Mocha测试之前删除MongoDB数据库,mongodb,testing,mongoose,mocha.js,should.js,Mongodb,Testing,Mongoose,Mocha.js,Should.js,如果我尝试在之后使用删除数据库(在测试结束时),它会工作 如果我尝试以下方法: var db = mongoose.connect('mongodb://localhost/db-test') describe('Database', function() { before(function (done) { db.connection.db.dropDatabase(function(){ done() }) })

如果我尝试在之后使用
删除数据库(在测试结束时),它会工作

如果我尝试以下方法:

var db = mongoose.connect('mongodb://localhost/db-test')

describe('Database', function() {

    before(function (done) {
        db.connection.db.dropDatabase(function(){
            done()
        })
    })

    ...

它不会降低DB。发生了什么事?我更喜欢在开始测试之前删除数据库,这样在测试之后我就可以浏览数据库了。

通过在另一个定义中连接解决了。。不确定是否理想

describe('Init', function() {

    before(function (done) {   
        mongoose.connect('mongodb://localhost/db-test', function(){
            mongoose.connection.db.dropDatabase(function(){
                done()
            })    
        })
    })

    describe('Database', function() {

我实现的有点不同

  • 我删除了“before”钩子中的所有文档-发现它比dropDatabase()快得多
  • 我使用Promise.all()确保在退出挂钩之前删除所有文档

    beforeEach(function (done) {
    
        function clearDB() {
            var promises = [
                Model1.remove().exec(),
                Model2.remove().exec(),
                Model3.remove().exec()
            ];
    
            Promise.all(promises)
                .then(function () {
                    done();
                })
        }
    
        if (mongoose.connection.readyState === 0) {
            mongoose.connect(config.dbUrl, function (err) {
                if (err) {
                    throw err;
                }
                return clearDB();
            });
        } else {
            return clearDB();
        }
    });
    

  • 我也有同样的问题。我的猜测是,在开始测试时,连接还不可用。您只需将mongoose适配器传递给
    cleanDb
    函数即可使用。它也不会破坏模型,但会清除它们的实体。删除数据库将丢失所有索引。这是一个更好的方法。