使用外部模块进行JavaScript单元测试

时间:2017-07-05 18:42:49

标签: javascript node.js unit-testing nodeunit

我正在开发一个现有节点项目,其中大多数js文件的代码结构如下所示。

    var mod1 = require("mod1");
    var mod2 = require("mod2");
    var modn = require("moden");


    function func1(data, callback) {
        // Do some validation with data etc.. 
        // Use one or more imported modules here 

    }

    function func2(data, callback) {
        // Do some validation with data etc.. 
        // Use one or more imported modules here 

    }


    exports.func1 = func1
    exports.func2 = func2 

单元如何测试func1,而不依赖于导入的模块?我怎么能模拟/存根呢? 我来自Java世界所以我熟悉模拟概念,但在这里我不知道如何使用require模拟全局声明的模块导入。

目前我们使用nodeunit进行单元测试,但它只测试了很小一部分代码。

我正在阅读关于simon.js和testdouble但不确定如何使用它们来模拟全局变量。

感谢任何帮助/指示。

1 个答案:

答案 0 :(得分:0)

为了在测试期间覆盖依赖项,我建议在您的情况下使用https://github.com/thlorenz/proxyquire模块

为了快速说明,我从项目github

粘贴示例

foo.js:

var path = require('path');

module.exports.extnameAllCaps = function (file) {
 return path.extname(file).toUpperCase();
};

module.exports.basenameAllCaps = function (file) {
 return path.basename(file).toUpperCase();
}

foo.test.js:

var proxyquire =  require('proxyquire')
, assert     =  require('assert')
, pathStub   =  { };

// when no overrides are specified, path.extname behaves normally
var foo = proxyquire('./foo', { 'path': pathStub });
assert.equal(foo.extnameAllCaps('file.txt'), '.TXT');