【问题标题】:Mongoose Insert never returns in unit test猫鼬插入永远不会在单元测试中返回
【发布时间】:2014-05-10 02:00:20
【问题描述】:

我正在创建一个单元测试来测试 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.connect("mongodb://localhost/testing");

并以这种方式要求用户:

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

有效。

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

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

【问题讨论】:

  • 我不清楚你的意思...我假设没有调用传递给user.save 的回调,因此测试超时。我说的对吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如@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();
    

    模型类按预期执行。

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2021-03-04
      • 2016-05-19
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多