单元测试node.js模型代码访问mongodb,而不实际访问数据库

单元测试node.js模型代码访问mongodb,而不实际访问数据库,node.js,unit-testing,mocking,Node.js,Unit Testing,Mocking,例如,我有以下代码: var db = require('./_mongo.js'); module.exports = { check: function (cb) { var content = {}; content.collection = 'counters'; content.query = {_id: 'ping'}; content.columns = {}; db.read(content,

例如,我有以下代码:

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”函数编写单元测试,同时检查是否能够对传递给read方法的正确“content”变量进行编码?

您可以使用模拟框架模拟整个模块,如:

我不建议模拟数据库访问,它可能需要您对所有可能的响应进行编码

最好将数据库访问隐藏在抽象服务层后面,并模拟该层

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

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);
            }
        });
    }
};
提供用于清除模块依赖项的机制。它还支持执行单个或多个测试组,以及将节点检查器步进单个测试

阅读更多关于它的信息

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