NPM測試模塊之rewire教程
摘要:有了rewire模塊,再也不用擔心測試私有函數了。
在玩轉Node.js單元測試,我介紹了3個用於編寫測試代碼的NPM模塊:Mocha, Should以及SuperTest。為了慫恿大家寫單元測試,我再介紹一款神奇的NPM測試模塊:rewire。
- GitHub倉庫: Fundebug/rewire-tutorial
rewire原理
對於技術,知其然,也應該知其所以然。
對於rewire,它的基本功能與require相同,都是用於導入模塊,只是,它會為導入的模塊添加兩個特殊的函數:__get__與__set__。顧名思義,這兩個函數可以分別用於獲取和修改模塊中的變量/函數。測試的時候,當我們需要獲取或者重寫私有變量/函數,rewire非常有用。
__get__: 獲取私有變量/函數
下面是需要測試的代碼示例1:
// 公有函數add
|
可知,add為公有函數,而sub為私有函數。
測試公有函數add時,非常方便,require之後可以直接獲取:
// 測試公有函數add
|
但是,測試私有函數sub時,使用require是無法獲取的。這時,可以使用rewire導入模塊,然後使用其提供的__get__方法獲取私有函數:
// 測試私有函數sub
|
在編寫模塊的時候,難免存在一些私有變量或者函數,有了rewire
Fundebug是全棧JavaScript錯誤監控平臺,支持各種前端和後端框架,可以幫助您第一時間發現BUG!
__set__: 重寫私有變量/函數
下面是需要測試代碼示例2:
var fs = require("fs")
|
可知,如果直接測試的話,add函數的計算結果會寫入result.txt文件:
var assert = require("assert");
|
但是,當我們測試時,並不希望去寫磁盤,因為當內容很多時,這樣比較浪費時間。這時,我們可以使用rewire導入模塊,然後使用其提供的__set__來重寫fs模塊,避免真的去寫磁盤:
var assert = require("assert");
|
在實踐中,為了簡化測試和節省時間,我們通常需要去重寫函數調用的外部函數,這時可以選擇使用rewire模塊實現。
另外,rewire模塊還提供了__with__接口,可以用於一次性重寫私有變量/函數。不過這個功能通常可以使用mocha的before/after以及beforeEach/afterEach來實現,更為直觀,因此本文不再介紹。
參考
- Fundebug: 玩轉Node.js單元測試
- Fundebug: 重新思考單元測試
版權聲明: 轉載時請註明作者Fundebug以及本文地址: https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/
NPM測試模塊之rewire教程