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

來源:互聯網
上載者:User

  今天要介紹的兩個模組分別是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,如非Null 字元串'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()的Regex、字串和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可以重複性的在不同上下文運行同樣的代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.