【发布时间】:2016-06-24 18:21:04
【问题描述】:
我是单元测试节点和 mongodb 的新手......我正在尝试测试 getUsername(),但我得到了 TypeError: user.find is not a function。我相信这可能是一种竞争条件,在第一个 it 块运行之前,db-init.js 脚本没有及时与数据库建立连接。
需要明确的是,测试之外的代码没有问题。在测试之外,一切正常。
有什么建议吗?
测试:
var api = require('../app/js/api');
var httpMocks = require('node-mocks-http');
var req;
var res;
describe('db calls', function() {
beforeEach(function() {
api.initDBcursor();
req = httpMocks.createRequest({
params: { username: "foo" }
});
res = httpMocks.createResponse();
});
it('should get username',
function(done) {
api.getUsername(req, res);
console.log(res);
});
});
api.js
var mongo = require('../data/db-init');
var user;
function initDBcursor() {
user = mongo.collections.user;
}
function getUsername(req, res) {
console.log(user);
var document = user.find(req.params.username); //HERE IS WHERE IT ERRORS
_returnApi(document, res);
}
users.js
User.prototype.find = function(user) {
return this.collection.find(user).limit(1).next();
};
db-init.js
var MongoClient = require('mongodb').MongoClient;
var User = require('./models/users');
var db;
var collections = {
user: false //THIS SHOULD HAVE A VALUE FROM initCollections() BEFORE
//BEFORE THE FIRST IT BLOCK RUNS
};
function connect() {
var dbURI = 'mongodb://web-app:web-app@localhost/web-app';
return MongoClient.connect(dbURI)
.then(function(_db) {
db = _db;
console.log(colors
.bold('MongoDB default connection open to ' + dbURI));
initCollections();
})
.catch(function(err) {
console.log(colors
.red(err));
});
}
function initCollections() {
collections.user = new User(db);
}
【问题讨论】:
-
基本上,您正在尝试“推出自己的”ODM,并且不会是第一个这样做的人。因此,当您认为使用的
MongoClient.connect()旨在处理承诺或回调时,有明确和基本的原因。对其他类似问题的一般建议也适用于您。看看mongoose 代码库。它具有在没有承诺/回调链的情况下启动连接的概念,并且像您尝试做的那样建立了“模型”。然后了解它是如何处理这种连接的,并不是你想象的那样。
标签: node.js mongodb unit-testing mocha.js