我为Node.js编写了自己的瘦mongodb包装器,以消除代码重复。
但是,我遇到了使用Mocha和Should运行的异步单元测试的问题。
所发生的事情是,应该库的任何抛出异常都被MongoDB驱动程序而不是Mocha捕获。
即,Mocha都没有捕获错误,也没有调用done()函数。因此,Mocha打印出错误Error: timeout of 2000ms exceeded
。
包装模块的片段db.js
var mongodb = require('mongodb').MongoClient;
exports.getCollection = function(name, callback) {
mongodb.connect(dbConfig.dbURI, {auto_reconnect: true}, function(err, db) {
if (err)
return callback(err, null);
db.collection(name, {strict: true}, callback);
});
};
Mocha test.js
var should = require('should');
var db = require('./db.js');
describe('Collections', function() {
it.only('should retrieve user collection', function(done) {
db.getCollection('user', function(err, coll) {
should.not.exist(err);
coll.should.be.a('object');
// HERE goes an assertion ERROR
coll.collectionName.should.equal('user123');
done();
});
});
});
这个简单的test.js
var should = require('should');
var obj = {
call: function(callback) {
try {
console.log('Running callback(null);');
return callback(null);
}
catch(e) {
console.log('Catched an error:', e);
}
}
};
describe('Test', function() {
it('should catch an error', function(done) {
obj.call(function(err) {
should.exist(err);
done();
});
});
});
有没有办法解决这个问题?必须有一种方法来测试这样的代码。
答案 0 :(得分:1)
只是偶然的运气我发现a GitHub fork处理了一个不同的问题,但是代码让我意识到我可以用一个简单的技巧让Mocha抓住断言异常:
describe('Test', function() {
it('should catch an error', function(done) {
obj.call(function(err) {
try {
should.exist(err);
done();
} catch (err) {
done(err);
}
});
});
});
即。将should
调用包装到try/catch
块并在catch部分调用done(err)
完全符合预期:
done()
函数接受错误参数