NPM測試模組之rewire教程

Fundebug發表於2019-02-16

摘要:有了rewire模組,再也不用擔心測試私有函式了。

玩轉Node.js單元測試,我介紹了3個用於編寫測試程式碼的NPM模組:Mocha, Should以及SuperTest。為了慫恿大家寫單元測試,我再介紹一款神奇的NPM測試模組:rewire

rewire原理

對於技術,知其然,也應該知其所以然。

對於rewire,它的基本功能與require相同,都是用於匯入模組,只是,它會為匯入的模組新增兩個特殊的函式:__get____set__。顧名思義,這兩個函式可以分別用於獲取和修改模組中的變數/函式。測試的時候,當我們需要獲取或者重寫私有變數/函式,rewire非常有用。

__get__: 獲取私有變數/函式

下面是需要測試的程式碼示例1

// 公有函式add
function add(a, b)
{
    return a + b;
}

// 私有函式sub
function sub(a, b)
{
    return a - b;
}

exports.add = add;

可知,add為公有函式,而sub為私有函式。

測試公有函式add時,非常方便,require之後可以直接獲取:

// 測試公有函式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!

__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模組實現。

另外,rewire模組還提供了__with__介面,可以用於一次性重寫私有變數/函式。不過這個功能通常可以使用mocha的before/after以及beforeEach/afterEach來實現,更為直觀,因此本文不再介紹。

參考


版權宣告:
轉載時請註明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/

clipboard.png

相關文章