NodeJS里最常用的測(cè)試框架估計(jì)就是mocha了。它支持多種node的assert libs, 同時(shí)支持異步和同步的測(cè)試,同時(shí)支持多種方式導(dǎo)出結(jié)果,也支持直接在browser上跑Javascript代碼測(cè)試。
本文示例大多源于官網(wǎng)示例,部分示例結(jié)合需要或自己的感想有所改動(dòng)。更多介紹請(qǐng)看 官方網(wǎng)址:Mocha on Github
Installation:
當(dāng)你成功安裝nodejs v0.10 和 npm后執(zhí)行下面這條命令。
# npm install -g mocha
p.s. Ubuntu的注意apt源里的nodejs版本會(huì)比較舊,某些module會(huì)不支持,請(qǐng)從nodejs官網(wǎng)進(jìn)行源碼安裝。
First step to Mocha:
以下為最簡(jiǎn)單的一個(gè)mocha示例:
var assert = require("assert");describe('Array', function(){ describe('#indexOf()', function(){ it('should return -1 when the value is not present', function(){ assert.equal(-1, [1,2,3].indexOf(5)); assert.equal(-1, [1,2,3].indexOf(0)); }) })});describe (moduleName, testDetails) 由上述代碼可看出,describe是可以嵌套的,比如上述代碼嵌套的兩個(gè)describe就可以理解成測(cè)試人員希望測(cè)試Array模塊下的#indexOf() 子模塊。module_name 是可以隨便取的,關(guān)鍵是要讓人讀明白就好。
it (info, function) 具體的測(cè)試語(yǔ)句會(huì)放在it的回調(diào)函數(shù)里,一般來(lái)說(shuō)info字符串會(huì)寫期望的正確輸出的簡(jiǎn)要一句話文字說(shuō)明。當(dāng)該it block內(nèi)的test failed的時(shí)候控制臺(tái)就會(huì)把詳細(xì)信息打印出來(lái)。一般是從最外層的describe的module_name開(kāi)始輸出(可以理解成沿著路徑或者遞歸鏈或者回調(diào)鏈),最后輸出info,表示該期望的info內(nèi)容沒(méi)有被滿足。一個(gè)it對(duì)應(yīng)一個(gè)實(shí)際的test case
assert.equal (exp1, exp2) 斷言判斷exp1結(jié)果是否等于exp2, 這里采取的等于判斷是== 而并非 === 。即 assert.equal(1, ‘1') 認(rèn)為是True。這只是nodejs里的assert.js的一種斷言形式,下文會(huì)提到同樣比較常用的should.js。
如果exp1和exp2均為字符串,字符串比較出錯(cuò)時(shí)則控制臺(tái)會(huì)用顏色把相異的部分標(biāo)出來(lái)。
Asynchronous
Frist step 中的代碼顯然是個(gè) Synchronous 的代碼,那么對(duì)于異步代碼應(yīng)該怎么做呢?很簡(jiǎn)單,在你最深處的回調(diào)函數(shù)中加done()表示結(jié)束。
fs = require('fs');describe('File', function(){ describe('#readFile()', function(){ it('should read test.ls without error', function(done){ fs.readFile('test.ls', function(err){ if (err) throw err; done(); }); }) })})done ()<br> 按照瀑布流編程習(xí)慣,取名done是表示你回調(diào)的最深處,也就是結(jié)束寫嵌套回調(diào)函數(shù)。但對(duì)于回調(diào)鏈來(lái)說(shuō)done實(shí)際上意味著告訴mocha從此處開(kāi)始測(cè)試,一層層回調(diào)回去。
上例代碼是test pass的,我們嘗試把test.ls改成不存在的test.as。便會(huì)返回具體的錯(cuò)誤位置。
這里可能會(huì)有個(gè)疑問(wèn),假如我有兩個(gè)異步函數(shù)(兩條分叉的回調(diào)鏈),那我應(yīng)該在哪里加done()呢?實(shí)際上這個(gè)時(shí)候就不應(yīng)該在一個(gè)it里面存在兩個(gè)要測(cè)試的函數(shù),事實(shí)上一個(gè)it里面只能調(diào)用一次done,當(dāng)你調(diào)用多次done的話mocha會(huì)拋出錯(cuò)誤。所以應(yīng)該類似這樣:
新聞熱點(diǎn)
疑難解答
圖片精選