2014-01-11 34 views
1

例如,我有下面的代码:单元测试的Node.js型号代码访问MongoDB的,实际上并没有访问数据库

var db = require('./_mongo.js'); 
module.exports = { 
    check: function (cb) { 
     var content = {}; 
     content.collection = 'counters'; 
     content.query = {_id: 'ping'}; 
     content.columns = {}; 
     db.read(content, function(err, result){ 
      if (err) { 
       cb(-1); 
      } 
      else { 
       cb(0); 
      } 
     }); 
    } 
}; 

我怎样写为“检查”功能的单元测试,而无需实际访问数据库,同时检查是否能够编写正确的'内容'变量传递给读取方法?

回答

1

您可以模拟整个模块使用模拟框架,像sinon.js

var db = sinon.mock(require('_mongo.js')) 

我不会推荐给模拟数据库访问,这可能需要你代码中所有可能的反应......

如果您将数据库访问隐藏在抽象服务层后面并嘲笑该层,那最好。

例如,您可以通过这种方式创建一个数据库访问层:

var db = require('./_mongo.js'); 
module.exports = { 
    //this is a mockable method 
    getCounter: function (id, callback) { 
     var content = {}; 
     content.collection = 'counters'; 
     content.query = {_id: id}; 
     content.columns = {}; 
     db.read(content, callback); 
    } 
}; 

//and then using it 
module.exports = { 
    check: function (cb) { 
     //access the actual method or the mock 
     da.getCounter('ping', function(err, result){ 
      if (err) { 
       cb(-1); 
      } 
      else { 
       cb(0); 
      } 
     }); 
    } 
}; 
0

test-studio为删空模块依赖的机制。它还支持执行单个或多组测试以及将节点检查器逐步进行单独测试等操作。

了解更多关于它here