unit testingnode.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); } }); } }; 

如何在不实际访问数据库的情况下编写“check”函数的unit testing,同时检查是否能够编写正确的传递给读取方法的“content”variables?

你可以用模拟框架来模拟整个模块,比如sinon.js :

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

我不build议模拟数据库访问,它可能会要求你编码所有可能的答复…

如果你将数据库访问隐藏在一个抽象的服务层后面并且模拟这个层,那将是最好的。

例如,您可以通过以下方式创build数据库访问层:

 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); } }); } }; 

test-studio提供了对模块依赖关系进行存根的机制。 它还支持诸如执行单个或多组testing以及将节点检查器逐步进行单独testing等。

在这里阅读更多关于它。