Node.js Mongo数据库未能每隔一次测试运行准备就绪

Node.js Mongo数据库未能每隔一次测试运行准备就绪,node.js,mongodb,mongoose,mocha.js,Node.js,Mongodb,Mongoose,Mocha.js,我正在使用Mocha在我的Express well Keystone服务器上运行测试,该服务器使用Mongoose/MongoDB。在before Mocha钩子中,我删除数据库,然后初始化模型,然后加载一些装置,所有这些装置都在async.series调用中控制,因此我可以保证这些事情是按顺序发生的 每运行一次,其中一个测试就会失败。该测试发出一个API调用,在数据库上执行地理查询。它失败于: ․{ [MongoError: Unable to execute query: error pro

我正在使用Mocha在我的Express well Keystone服务器上运行测试,该服务器使用Mongoose/MongoDB。在before Mocha钩子中,我删除数据库,然后初始化模型,然后加载一些装置,所有这些装置都在async.series调用中控制,因此我可以保证这些事情是按顺序发生的

每运行一次,其中一个测试就会失败。该测试发出一个API调用,在数据库上执行地理查询。它失败于:

․{ [MongoError: Unable to execute query: error processing query: ns=test.locations limit=50 skip=0
Tree: GEONEAR  field=lnglat.geo maxdist=5000 isNearSphere=0
Sort: {}
Proj: {}
 planner returned error: unable to find index for $geoNear query] name: 'MongoError' }
․TypeError: Cannot read property 'length' of undefined
然后在下一次运行中,它成功了。然后下一次它失败了。诸如此类,一成不变


是否有某种方法可以检查数据库是否准备好在其上运行这些测试?对于奖金积分,到底是什么导致了这种一致的变化?

假设您的代码组织与此类似:

server.js

lib/api_routes.js

test/my_test.js

Express继承。您的数据库连接正在使用db.connection.once执行相同的操作。它只会执行。。。连接数据库后!在该函数中,您将发出一个事件,让您的前钩子知道如何执行其回调,从而启动测试套件中的下一个钩子/测试

作为旁注,异步运行测试设置不需要异步库。如果您在回调之前传递钩子,Mocha将自己异步运行它们。对于要运行的每个安装任务,都可以有一个before块

var mongoose = require('mongoose');
var express = require('express');

var db = mongoose.connect('mongodb://localhost/my-database');
var app = express();

db.connection.once('connected', function() {

    require('./lib/api_routes')(app);
    app.listen(3000, function() {
        console.log('listening on 3000');
    }

    app.emit('dbLoaded');
});

exports = module.exports = app;
module.exports = function(app) {
    app.get('/api/my_route', function(req, res) {
        ...
    }
}
var app = require('../server');

before(function(done) {
    app.on('dbLoaded', function() {
        console.log('db is connected');
        done();
    }
}

before(function() {
    ... your test initialization code
}