繁体   English   中英

如何使用Mocha和Chai单元测试此node.js模块?

[英]How can I unit test this node.js module using mocha and chai?

我的文件包含以下代码,这是我的api的数据库层。 它在外部依赖于SQL Server来获取数据。

var sql = require('mssql');
var async = require('async');

module.exports = {
    getDetails: function(number, callback) {

    async.parallel({
            general: function(callback) {
                getGeneral(number, callback);
            },
            preferences: function(callback) {
                getPref(number, callback);
            }
        },
        function(err, results) {
            if (err) {
                logger.error(err);
                throw err;
            }
            callback(results);
        });
}
};

function getGeneral(number, callback) {
    var mainconnection = new sql.Connection(dbCredentials[1].generalDBConfig, function(err) {
        var request = new sql.Request(mainconnection);
        request.input('number', sql.BigInt, number);
        request.execute('[number].[genral_get]', function(err, recordsets) {
            if (err) {
                logger.error(err);
            }
            var gen = {};
            var spResult = recordsets[0];
            if (spResult[0] != null) {
                spResult.forEach(function(record) {
                    var test = {};
                    gen[record.genCode] = record.genValue;
                });

                callback(null, gen);
            } else {
                callback(null, null);
            }

        });

    });
}

function getPref(number, callback) {
    var mainconnection = new sql.Connection(dbCredentials[0].prefDBConfig, function(err) {
        var request = new sql.Request(mainconnection);
        request.input('number', sql.BigInt, number);
        request.execute('[number].[pref_get]', function(err, recordsets) {
            if (err) {
                logger.error(err);
            }
            var spResult = recordsets[0];
            if (spResult[0] != null) {
                callback(null, spResult[0]);
            } else {
                callback(null, null);
            }

        });

    });
}

数据库层返回此JSON格式的数据:

{
                        "general": {
                            "number": "72720604"
                            "title": "Mr  ",
                            "buildingNameNumber": null,
                            "subBuildingName": null,
                            "streetName": null,
                            "postalTown": null,
                            "county": null
                        },
                        "pref": {
                            "UseAccessibilitySite": "00000",
                            "IntroductorySource": "75"
                        }
                    };

由于我是单元测试的新手,即使选择带有chai的mocha作为我的单元测试框架,我也不知道如何开始为此模块编写单元测试。 任何形式的建议或帮助都将受到赞赏...

问题是:您到底要在此代码中测试什么?

我假设答案大致是“我想在测试套件中调用getDetails()并验证其行为正确”。

当然,您不想在测试套件中创建整个MSSQL服务器。 相反, 存根数据库要容易得多。

我曾获得巨大成功的用于模拟 ,存根和监视的模块是sinon.js 对于您的代码,您需要添加一些内容:

  • 存根sql.Connection()返回存根的连接对象。
  • 存根sql.Request()返回具有inputexecute方法的存根对象。
  • 存根sql.BigInt()以验证它是否被正确调用。

然后,对于存根request对象,您需要:

  • 验证.input()是否被正确调用。
  • 确保execute返回您选择的记录。

完全测试getDetails()函数将需要大量的设置工作。 您可能也有兴趣的中联控模块,使您可以测试getGeneral()getPref()直接,而无需将其添加到module.exports

最后,将此代码重构为较小的部分也将很有帮助。 例如,如果您可以执行以下操作:

// This is your own db module, which takes care of connecting
// to the database for you.
var db = require('./db');

function getGeneral(number, callback) {
    var request = db.createRequest();
    // The rest of the function
}

这样,使用sinon创建一个完全可以执行您想要的操作的伪请求对象会容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM