在mongoose模型和快速路线上运行mocha测试时超时

时间:2013-11-20 13:36:33

标签: node.js express mongoose mocha supertest

我在为Mongoose模型编写测试时遇到问题我的快速应用程序(路线)

我有一个非常简单的app.js文件:

var env = process.env.NODE_ENV || 'development',
    express = require('express'),
    config = require('./config/config')[env],
    http = require('http'),
    mongoose = require('mongoose');

// Bootstrap db connection
mongoose.connect(config.db)

// Bootstrap models
var models_path = __dirname + '/app/model';
fs.readdirSync(models_path).forEach(function(file) {
    if (~file.indexOf('.js')) {
        require(models_path + '/' + file);
    }
});

var app = express();

// express settings
require('./config/express')(app, config);

// Bootstrap routes
require('./config/routes')(app, compact);

if (!module.parent) {
    app.listen(app.get('port'), function() {
        console.log('Server started on port ' + app.get('port'));
    })
}

module.exports = app;

我有一个名为model的文件夹,其中包含我的猫鼬模型。

我有一个test文件夹,accountTest.js - 看起来有点像这样:
(这是为了测试我的帐户模型)

var utils = require('./utils'),
  should = require('chai').should(),
  Account = require('../app/model/account');

describe('Account', function() {
  var currentUser = null;
  var account = null;

  it('has created date set on save', function(done) {
    var account = new Account();

    account.save(function(err) {
      account.created.should.not.be.null;
      done();
    });
  });

utils取自这里:http://www.scotchmedia.com/tutorials/express/authentication/1/06

如果我将它留在这一个测试中,这是有效的。

如果我添加另一个测试,测试我的快速路线,就像这样:

var request = require('supertest'),
    app = require('../../app'),
    should = require('chai').should();

describe('Account controller', function() {

    it('GET /account returns view', function(done) {
        //omitted for brevity
        done();
    });
});

然后在我的模型测试中出现超时错误...

影响它的行是app = require('../../app')
如果我删除它,那么就没有超时。

我意识到它可能与mongoose连接有关,但不确定如何在测试之间“共享”它?

1 个答案:

答案 0 :(得分:0)

mocha有root Suite

You may also pick any file and add "root" level hooks, for example add beforeEach() outside of describe()s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root Suite with no name.

使用它来启动Express服务器一次(我们使用环境变量,使其在与开发服务器不同的端口上运行):

before(function () {
  process.env.NODE_ENV = 'test';
  require('../../app.js');
});

(我们这里不需要done(),因为require是同步的。)这就是服务器只启动了一次,无论有多少个不同的测试文件都包含这个根级before函数