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

时间:2014-01-11 21:38:35

标签: 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, function(err, result){
            if (err) {
                cb(-1);
            }
            else {
                cb(0);
            }
        });
    }
};

如何在不实际访问数据库的情况下为'check'函数编写单元测试,同时检查我是否能够编写传递给read方法的正确'content'变量?

2 个答案:

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

答案 1 :(得分:0)

test-studio提供了存根模块依赖关系的机制。它还支持执行单个或一组测试以及将节点检查器单步执行到单个测试中的操作。

详细了解here