摘要:有了rewire模块,不再用担忧测试私有函数了。javascript
在玩转Node.js单元测试,我介绍了3个用于编写测试代码的NPM模块:Mocha, Should以及SuperTest。为了怂恿你们写单元测试,我再介绍一款神奇的NPM测试模块:rewire。前端
对于技术,知其然,也应该知其因此然。java
对于rewire,它的基本功能与require相同,都是用于导入模块,只是,它会为导入的模块添加两个特殊的函数:__get__与__set__。顾名思义,这两个函数能够分别用于获取和修改模块中的变量/函数。测试的时候,当咱们须要获取或者重写私有变量/函数,rewire很是有用。node
下面是须要测试的代码示例1:git
// 公有函数add
function add(a, b) {
return a + b;
}
// 私有函数sub
function sub(a, b) {
return a - b;
}
exports.add = add;
复制代码
可知,add为公有函数,而sub为私有函数。github
测试公有函数add时,很是方便,require以后能够直接获取:npm
// 测试公有函数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!函数
下面是须要测试代码示例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来实现,更为直观,所以本文再也不介绍。