2013-08-24 50 views
1

我已经编写了自己的用于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); 
    }); 
}; 

摩卡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

难道真的没有人有想法吗?我试图多次分析这个问题,但没有找到任何解决办法。这意味着我无法测试我的DB代码:( –

回答

1

只需通过一个偶然的运气,我看到a GitHub fork处理不同的问题,但这些代码使我意识到,我可以用一个简单的技巧,使摩卡赶上断言例外:

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块和闭锁段调用done(err)究竟是干什么的预期:如果没有发生断言错误

  • 测试中断言错误感谢的情况下未能done()函数接受一个

    1. 测试顺利通过错误参数