2014-10-11 41 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()塊。

相關問題