如何测试自己的mongodb包装器

时间:2013-08-24 10:17:06

标签: javascript node.js unit-testing mongodb mocha

我为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();
        });
    });
});

有没有办法解决这个问题?必须有一种方法来测试这样的代码。

1 个答案:

答案 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)完全符合预期:

  1. 如果没有发生断言错误,则测试成功通过
  2. 由于done()函数接受错误参数
  3. ,如果出现断言错误,则测试失败