NPM测试模块之rewire教程

择要:有了rewire模块,再也不必忧郁测试私有函数了。

玩转Node.js单元测试,我引见了3个用于编写测试代码的NPM模块:Mocha, Should以及SuperTest。为了煽动人人写单元测试,我再引见一款奇异的NPM测试模块:rewire

rewire道理

关于手艺,知其然,也应当知其所以然。

关于rewire,它的基本功用与require雷同,都是用于导入模块,只是,它会为导入的模块增加两个特别的函数:__get____set__。望文生义,这两个函数能够离别用于猎取和修正模块中的变量/函数。测试的时刻,当我们须要猎取或许重写私有变量/函数,rewire异常有效。

__get__: 猎取私有变量/函数

下面是须要测试的代码示例1

// 公有函数add
function add(a, b)
{
    return a + b;
}

// 私有函数sub
function sub(a, b)
{
    return a - b;
}

exports.add = add;

可知,add为公有函数,而sub为私有函数。

测试公有函数add时,异常轻易,require以后能够直接猎取:

// 测试公有函数add
var assert  = require("assert");
var add = require("../test1.js").add;

it("1加1即是2", function()
{
    var result = add(1, 1);
    assert.equal(result, 2);
});

然则,测试私有函数sub时,运用require是没法猎取的。这时候,能够运用rewire导入模块,然后运用其供应的__get__要领猎取私有函数:

// 测试私有函数sub
var assert  = require("assert");
var rewire = require("rewire");
var sub = rewire("../test1.js").__get__("sub");

it("2减1即是1", function()
{
    var result = sub(2, 1);
    assert.equal(result, 1);
});

在编写模块的时刻,不免存在一些私有变量或许函数,有了rewire,我们就能够轻易地猎取,然后举行测试。

Fundebug是全栈JavaScript毛病监控平台,支撑种种前端和后端框架,能够帮助您第一时间发明BUG!

__set__: 重写私有变量/函数

下面是须要测试代码示例2

var fs = require("fs")

function add(a, b)
{
    let result = a + b;
    fs.writeFileSync("result.txt", result);
    return result;
}

exports.add = add;

可知,假如直接测试的话,add函数的计算结果会写入result.txt文件:

var assert = require("assert");
var add = require("../test2.js").add;

it("1加1即是2", function()
{
    let result = add(1, 2);
    assert.equal(result, 3);
});

然则,当我们测试时,并不希望去写磁盘,由于当内容很多时,如许比较浪费时间。这时候,我们能够运用rewire导入模块,然后运用其供应的__set__来重写fs模块,防止真的去写磁盘:

var assert = require("assert");
var rewire = require("rewire");
var myModule = rewire("../test2.js")
var add = myModule.add;

var fsMock = {
    writeFileSync: function(file, data, option) { /* 啥也不干 */ }
};

myModule.__set__("fs", fsMock);

it("1加1即是2", function()
{
    let result = add(1, 2);
    assert.equal(result, 3);
});

在实践中,为了简化测试和节省时间,我们一般须要去重写函数挪用的外部函数,这时候能够挑选运用rewire模块完成。

别的,rewire模块还供应了__with__接口,能够用于一次性重写私有变量/函数。不过这个功用一般能够运用mocha的before/after以及beforeEach/afterEach来完成,更加直观,因而本文不再引见。

参考

版权声明:
转载时请说明作者Fundebug以及本文地点:
https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/

《NPM测试模块之rewire教程》

    原文作者:Fundebug
    原文地址: https://segmentfault.com/a/1190000012939500
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞