猫鼬插入永远不会在单元测试中返回

Posted

技术标签:

【中文标题】猫鼬插入永远不会在单元测试中返回【英文标题】: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 的回调,因此测试超时。我说的对吗? 【参考方案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();

模型类按预期执行。

【讨论】:

以上是关于猫鼬插入永远不会在单元测试中返回的主要内容,如果未能解决你的问题,请参考以下文章

设置 UI 测试 Xcode 7 后单元测试永远不会运行

如何在 mocha 单元测试中使用猫鼬?

开玩笑单元测试返回“MongoError:拓扑被破坏”

Android 单元测试 LiveData.value 返回 null

猫鼬承诺在某些条件下无法解决

单元测试:使用填充时如何模拟猫鼬代码?