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

Art*_*Ale 17 javascript unit-testing commonjs node.js

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

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

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

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

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

Gol*_*den 22

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

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

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

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


小智 8

因为我发现测试是一个超越单元测试和TDD的有用工具(这个SO答案是一个很好的论据),我制作了一个npm包来帮助像你这样的情况:require-from.

在您的示例中,这是您将如何使用它:

module-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;
Run Code Online (Sandbox Code Playgroud)

imports-file.js:

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