摘要:有了rewire模块,你再也不用为测试私有函数而烦恼了。在玩转Node.js单元测试中,我介绍了3个用于编写测试代码的NPM模块:Mocha、Should和SuperTest。为了鼓励大家写单元测试,我再介绍一个神奇的NPM测试模块:rewire。GitHub仓库:Fundebug/rewire-tutorialrewire的原理对于技术,知其然也知其所以然。对于rewire,它的基本功能和require一样,都是用来导入模块的,但是它会给导入的模块增加两个特殊的函数:__get__和__set__。顾名思义,这两个函数可以分别用来获取和修改模块中的变量/函数。在测试的时候,当我们需要获取或重写私有变量/函数时,rewire就非常有用。__get__:获取私有变量/函数下面是需要测试的代码示例1://publicfunctionaddfunctionadd(a,b){returna+b;}//privatefunctionsubfunctionsub(a,b){returna-b;}exports.add=add;可见add是公有函数,sub是私有函数。测试公共函数add非常方便,require后直接获取即可://测试公共函数addvarassert=require("assert");varadd=require("../test1.js").add;it("1加1等于2",function(){varresult=add(1,1);assert.equal(result,2);});但是在测试私有函数sub的时候,使用require是获取不到的。这时候可以使用rewire导入模块,然后使用它提供的__get__方法获取私有函数://测试私有函数subvarassert=require("assert");varrewire=require("rewire");varsub=rewire("../test1.js").__get__("sub");it("2减1等于1",function(){varresult=sub(2,1);assert.equal(result,1);});在写模块的时候,难免会有一些私有变量或者函数。通过rewire,我们可以很容易地获取到它们,然后进行测试。Fundebug是一个全栈的JavaScript错误监控平台,支持各种前后端框架,可以帮你第一时间发现bug!__set__:Overrideprivatevariables/functions下面是requiredtestcodeexample2:varfs=require("fs")functionadd(a,b){letresult=a+b;fs.writeFileSync("result.txt",result);返回结果;}exports.add=添加;可以看到,如果直接测试,add函数的计算结果会写入result.txt文件:varassert=require("assert");varadd=require("../test2.js").add;it("1加1等于2",function(){letresult=add(1,2);assert.equal(result,3);});但是,当我们测试的时候,是不想写磁盘的,因为当内容很多的时候,很浪费时间。此时,我们可以使用rewire导入模块,然后使用其提供的__set__重写fs模块,避免实际写入磁盘:varassert=require("assert");varrewire=require("rewire");varmyModule=rewire("../test2.js")varadd=myModule.add;varfsMock={writeFileSync:function(file,data,option){/*什么都不做*/}};myModule.__set__("fs",fsMock);it("1加1等于2",function(){letresult=add(1,2);assert.equal(result,3);});在实践中,为了简化测试和节省时间,我们通常需要重写函数调用的外部函数。这时候我们可以选择使用rewire模块来实现。此外,rewire模块还提供了__with__接口,可用于一次性改写私有变量/函数。不过这个功能通常可以使用mocha的before/after和beforeEach/afterEach来实现,比较直观,本文不做介绍。参考Fundebug:FunwithNode.jsUnitTestingFundebug:RethinkingUnitTesting版权声明:转载请注明作者Fundebug和本文地址:https://blog.fundebug.com/2017/12/27/npm-重新布线-教程/
