Mongoose Insert永远不会在单元测试中返回

时间:2014-03-30 20:40:27

标签: node.js mongoose mocha passport.js kraken.js

我正在创建一个测试Passport的单元测试,第一步是创建一个用户。创建用户超时并且测试无法进行。

测试(login.js):

'use strict';
var app = require('../index'),
    kraken = require('kraken-js'),
    mongoose = require('mongoose'),
    User = mongoose.model('User'),
    should = require('chai').should(),
    Q = require('q'),
    agent = require('supertest'),
    cookie,
    pUser = {
        firstName: 'pasport-test',
        lastName: 'user',
        userName: 'passport-user',
        email: 'passport-user@here.com',
        password: 'h@rdP@ssw0rd'
    }

    describe('#create user and log them in with passport', function () {
        this.timeout(10000);
        var mock;
        beforeEach(function (done) {
            kraken.create(app).listen(function (err, server) {
                mock = server;
                done(err);
            });
        });


        afterEach(function (done) {
            mock.close(done);
        });

        describe('#login the user', function () {
            it('should create a user', function (done) {
                var user = new User({
                    firstName: pUser.firstName,
                    lastName: pUser.lastName,
                    userName: pUser.userName,
                    email: pUser.email,
                    password: pUser.password
                });
                user.save(function(err, data) {
                    if(err) {
                        done(err);
                    } else {
                        done();
                    }
                });
                //it should then login that user with passport
            });
        });

如果我直接将o连接到mongoose:

mongoose.connect("mongodb://localhost/testing");

并以这种方式要求用户:

User = require('../models/user');

有效。

我想使用beforeEach与kraken建立的服务器和连接,以便在配置的数据库中进行插入...

问题是为什么猫鼬插入物在测试中永远不会回来?

2 个答案:

答案 0 :(得分:2)

您需要在测试代码中调用mongoose.connect。 mongoose将所有挂起的操作排队,直到建立第一个数据库连接,这就是为什么你的save回调永远不会被调用。

答案 1 :(得分:0)

正如@Peter Lyons所说,我需要执行与数据库的连接。

我写了一个小帮手(我可以在我的测试文件中使用)。

db.js:

'use strict';
var nconf = require('nconf'),
    mongoose = require('mongoose'),
    env = process.env.NODE_ENV || 'testing';

//get the db config stuff for mongoose from the application config file
nconf.use('file', {
    file: process.cwd() + '/config/app.json',
    format: nconf.formats.json
});
var dbConf = nconf.get('databaseConfig')[env];



var db = function() {
    return {
        connect: function() {
            if(!mongoose.connection.db) {
                mongoose.connect("mongodb://" + dbConf.host + '/' + dbConf.database);
            }
        }
    };
};

module.exports = db();

然后在我的测试中:

var db = require('./db');

db.connect();

模型类按预期执行。