如何在nodejs中对“私有”效用函数进行单元测试

时间:2013-03-10 12:44:20

标签: javascript node.js unit-testing commonjs

我正在为nodejs应用程序编写一些测试。 假设我有一个这样的模块:

module.exports = function myModule(moduleParam) {
    var someVar;
    ....
    ....
    function helper(param) {
        return param + someVar;
    }
    return {
        doSomething: function (bar) {
            ....
            ....
            var foo = helper(bar);
            ....
            ....
        }
    };
};

假设'helper'函数仅在模块中有用,不应暴露给外部。

测试它的“最佳实践”是什么? (当然,我可以测试doSomething函数作为一个整体,但这样,'helper'函数在特定情况下以'黑盒'的方式进行测试。)

我正在使用nodeunit作为测试框架,但我可以根据需要进行更改。

2 个答案:

答案 0 :(得分:22)

你没有测试它。单元测试是黑盒测试。这意味着您测试的唯一内容是公共接口即契约。

这些私人功能只能通过重构公共功能来实现。

因此,如果您因此使用TDD,则会隐式测试您的私有函数。

如果这感觉不对,最常见的原因是你的结构错了。然后你应该考虑将你的私人资料转移到一个额外的模块。

答案 1 :(得分:8)

因为我发现测试是单元测试之外的有用工具而且TDD(this SO answer是一个很好的论据),我制作了一个npm包来帮助像你这样的情况:require-from

在您的示例中,您将使用它:

模块file.js

function helper(param) {
    return param + someVar;
}

module.exports = function myModule(moduleParam) {
    var someVar;
    ....
    ....
    return {
        doSomething: function (bar) {
            ....
            ....
            var foo = helper(bar);
            ....
            ....
        }
    };
};
module.helperExports = helper;

导入-file.js

var requireFrom = require('require-from');
var helper = requireFrom('helperExports', './module-file'));
var public = requireFrom('exports', './module-file')); // same as require('./module-file')