2014-10-11 38 views
0

我正在使用Mocha在使用Mongoose/MongoDB的Express(well,Keystone)服务器上运行测试。在before Mocha挂钩中,我放下数据库,然后初始化模型,然后加载一些灯具,所有灯具都在async.series调用中进行控制,因此我确信这些事情是按顺序发生的。Mongo数据库未能准备好每隔一次测试运行

其中一个测试失败了其他运行。该测试会对数据库执行一个地理查询的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 

然后在下次运行成功。然后下一个失败。等等,总是。

有什么方法可以检查数据库是否准备好让这些测试运行在它上面?对于奖金信用,世界上的什么会导致这种一致的交替?

回答

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 
} 

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

作为便笺,您不需要异步库来异步运行测试设置。如果你通过before()挂钩回调,摩卡将自行异步运行它们。您可以为要运行的每个设置任务设置一个before()块。

相关问题