我遲到了派對,但我發現設置我的摩卡測試套件的快速應用程序的最佳方式是使我的app.js或server.js文件導出應用程序對象,像這樣:
var mongoose = require('mongoose');
var express = require('express');
require('express-mongoose');
var env = process.env.NODE_ENV || 'development';
var config = require('./config/config')[env];
var models = require('./app/models');
var middleware = require('./app/middleware');
var routes = require('./app/routes');
var app = express();
app.set('port', process.env.PORT || config.port || 3000);
app.set('views', __dirname + '/app/views');
app.set('view engine', 'jade');
// database
mongoose.connect(config.db);
// middleware
middleware(app);
// Application routes
routes(app);
app.listen(app.get('port'));
console.log('Express server listening on port ' + app.get('port'));
// export app so we can test it
exports = module.exports = app;
確保您的配置文件都有不同的環境,如開發,測試,生產設置:
var path = require('path');
var rootPath = path.normalize(__dirname + '/..');
module.exports = {
development: {
db: 'mongodb://localhost/my_dev_db',
port: 3000
},
test: {
db: 'mongodb://localhost/my_test_db',
port: 8888
},
production: {
// ...
}
}
然後在您的測試文件,你可以繼續要求你的應用程序,它將連接到正確的數據庫和正確的端口:
var should = require('chai').should();
var request = require('supertest');
var mongoose = require('mongoose');
var app = require('../app');
var agent = request.agent(app);
var User = mongoose.model('User');
// get users
describe('GET /api/users', function() {
it('returns users as JSON', function(done) {
agent
.get('/api/users')
.expect(200)
.expect('Content-Type', /json/)
.end(function(err, res) {
if (err) return done(err);
res.body.should.have.property('users').and.be.instanceof(Array);
done();
});
});
});
最後,啓動了整個怪獸包括這在你的package.json
(請務必在你的devDependencies nodemon和摩卡):
"scripts": {
"start": "NODE_ENV=development ./node_modules/.bin/nodemon app.js",
"test": "NODE_ENV=test ./node_modules/.bin/mocha --reporter spec test/**.js"
}
現在你可以開始你的測試套件npm test
和您的應用程序npm start
。
希望它有幫助! PS:大部分的東西我從看着這個驚人的例子瞭解到: https://github.com/madhums/node-express-mongoose-demo
我遇到了完全類似的問題。我重新設計了我的快速服務器,現在不要等待數據庫連接或任何類型的異步初始化。這對於REST服務器來說也很理想,因爲即使沒有請求進入REST環境,也不需要連接到數據庫。此外,每次通話並不一定需要所有型號。 在我的情況下,我幾乎每次調用都需要初始化數據庫。 – Kamrul
@Kamrul:你可以請你分享一些示例代碼,如何做到這一點? –