今天要介紹的兩個模塊分別是assert和vm,下面我們就分別介紹。
使用assert做測試
node中,我們可以使用assert模塊來測試代碼。equal()和notEqual()分別作相等性和不等性的判斷,第一個參數是期望值,第二個參數是真實值,第三個參數是異常信息,例子如下:
var assert = require('assert'); assert.equal(1, true, 'Truthy'); assert.notEqual(1, true, 'Truthy');
測試通過,不會有結果顯示,但是一旦不通過就會有異常拋出,運行結果:
equal和notEqual相當於==和!==,在測試布爾值時會出現點小問題,false,0,空值(''),null,undefined,NaN都會返回false值;其他值都會返回true,如非空字符串'false','0'等。因為他們只適合比較一些簡單的值,如字符串、數字等。stringEqual() 和notStrictEqual()相當於=== 和 !==,可以做更精確的判斷。
ok()方法是比較真值的簡潔方法,相當於是用==比較當前值是否為true。
var assert = require('assert');
assert.ok('This is a string', 'Strings that are not empty are truthy');
assert.ok(0, 'Zero is not truthy');
node提供了對object對象的比較方法deepEqual() 和 notDeepEqual(),他們采用下面的步驟比較對象,有一個步驟不匹配就拋出異常:1.采用===比較;2.比較他們是否是Buffers,如果是則比較長度,接下來每字節每字節的比較;3.是用==比較;4.最后如果參數是object對象,則比較他們得屬性長度和屬性值。可以看的出來,這兩個方法性能上可能要差些,所以只有在需要的時候才使用他們。
下面要介紹的方法是throws() 和 doesNotThrow(),他們用來判斷一段代碼是否會拋出異常,可以傳四種類型的參數:返回true或false的比較函數、使用regex.test()的正則表達式、字符串和typeof構造函數。
var assert = require('assert');
assert.throws(function() {
throw new Error("Seven Fingers. Ten is too mainstream.");
});
assert.doesNotThrow(function() {
throw new Error("I lived in the ocean way before Nemo");
});
VM(虛擬機)
使用vm模塊可以執行任意代碼並返回結果,他有一系列的特性允許你切換代碼執行上下文,他提供了一種沙盒模型。vm類似於eval()方法,但是提供了更多的特性和更好的api管理代碼。使用vm有兩種方法執行代碼:1.使用內嵌代碼,類似與使用eval;2.把預編譯代碼傳入vm.Script對象。
使用內嵌代碼的形式:
var vm = require('vm'); vm.runInThisContext("1+1");
運行結果:
下面我們來看vm.runInNewContext()的使用,第二個參數代表運行環境上下文。
var vm = require('vm'); var context = { alphabet:"" }; vm.runInNewContext("alphabet+='a'", context); vm.runInNewContext("alphabet+='b'", context); context
運行結果:
下面我們看vm.createScript如何使用。首先在你node的根目錄(一般為:‘C:\Program Files\nodejs’)准備一個名叫example.js的文件,內容為:
console.log(output);
在node REPL命令框運行如下代碼:
var vm = require('vm'); var fs = require('fs'); var code = fs.readFileSync('example.js'); code.toString(); var script = vm.createScript(code); script.runInNewContext({output:"Kick Ass"}); script.runInNewContext({"console":console,"output":"Kick Ass"});
運行結果:
使用vm.Script可以重復性的在不同上下文運行同樣的代碼。