node.js入門 - 13.api:使用assert測試和虛擬機(VM)


  今天要介紹的兩個模塊分別是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可以重復性的在不同上下文運行同樣的代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM