摘要:有了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來實現,更爲直觀,所以本文再也不介紹。