猫鼬插入永远不会在单元测试中返回
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();
模型类按预期执行。
【讨论】:
以上是关于猫鼬插入永远不会在单元测试中返回的主要内容,如果未能解决你的问题,请参考以下文章