Mongo数据库无法为每个其他测试运行做好准备

时间:2014-10-11 04:02:12

标签: node.js mongodb mongoose mocha

我使用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

然后在下一次运行中成功。接下来它失败了。等等,总是。

有什么方法可以检查数据库是否准备好运行这些测试?对于奖金积分,世界上会出现这种一致的变化吗?

1 个答案:

答案 0 :(得分:0)

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

<强> server.js

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;

<强> LIB / api_routes.js

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

<强>测试/ my_test.js

var app = require('../server');

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

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

Express继承the 'events' module。你的数据库连接与db.connection.once()做同样的事情。一旦数据库连接,它只会执行...在该函数中,您将发出一个事件,让您的before()钩子知道执行它的回调,开始测试套件中的下一个钩子/测试。

作为旁注,您不需要异步库来异步运行测试设置。如果你传递before()钩子回调,Mocha将在它自己的异步上运行它们。您可以为要运行的每个设置任务设置before()块。