资料来源: https://blog.fun debug.com/2017/12/27/NPM-rewire-tutorial /

Node.js单元测试介绍了用于编写三个测试代码: Mocha、Should和SuperTest的NPM模块。 为了鼓励大家写单元测试,我介绍另一个不可思议的NPM测试模块,rewire。

千兆仓库: I/O调试/重写原理对技术既了解又了解。

对于rewire,基本功能与require相同,用于导入模块,但会向导入的模块中添加两个特殊函数: __get__和__set__。 的寒风。 这两个函数分别可用于获取和修改模块中的变量/函数。 如果测试时需要获取或重写私有变量/函数,rewire将非常有用。

__get__:需要测试私有变量/函数的获取的代码示例1 :

//公共函数addfunctionadd(a,b ) { return a b; //私有函数subfunctionsub(a,b ) ) {return a – b; }exports.add=add; 可以看到add是公共函数,而sub是私有函数。

测试公共函数add时非常方便,在require之后可以直接获得。

//测试公共函数addvarassert=require(assert ); varadd=require(‘./test1.js ‘ ).add; it(‘1 1 )为2 ),函数) varresult=add (1,1 ); assert.equal(result,2 ); );

ine-height:1.6em;color:rgb(85,85,85);background-color:rgb(255,255,255);”>但是,测试私有函数sub时,使用require是无法获取的。这时,可以使用rewire导入模块,然后使用其提供的__get__方法获取私有函数:

// 测试私有函数subvar 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模块实现。

可知,如果直接测试的话,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来实现,更为直观,因此本文不再介绍。