這篇文章百分之99都是照著mocha官網(wǎng)的內(nèi)容來(lái)寫(xiě)的。就是個(gè)掃盲文领迈,如果你想獲得關(guān)于mocha更深層次不為人知的內(nèi)容彻磁,還是別浪費(fèi)你寶貴的十幾分鐘了碍沐,馬上叉掉。不為啥的衷蜓,我就做個(gè)筆記累提,方便以后復(fù)習(xí)。
mocha(抹茶)是一款javascript測(cè)試框架磁浇,支持在node和瀏覽器端運(yùn)行斋陪。它比QUnit更完善,可擴(kuò)展性更強(qiáng)置吓。在官網(wǎng)上无虚,對(duì)它的描述就是簡(jiǎn)單,可擴(kuò)展交洗,有趣骑科。(有趣是什么鬼)
使用
// 1
npm install mocha -g
mocha ./test.js
// 2
npm install mocha --save-dev
node .node_modules/mocha/bin/mocha ./test.js
主要api
mocha只有兩個(gè)主要的api。
- describe(name, fn) 定義一組測(cè)試
- it(name, fn) 定義一項(xiàng)測(cè)試
describe('proxy', function(){
it('proxy data 1', function(done){
this.timeout(1000)
assert.ok(true, 'fail')
})
你也可以在一組測(cè)試?yán)锩嬖俣x一組測(cè)試
describe('group1', function(){
describe('child1', function(){
})
})
只測(cè)試其中某一組測(cè)試
describe('test', function(){
describe.only('testc1', function(){
})
})
跳過(guò)某一組測(cè)試
describe('test', function(){
describe.skip('testc1', function(){
})
})
斷言
mocha沒(méi)有佩戴自己的斷言庫(kù)构拳,它允許你使用第三方斷言庫(kù)咆爽,如node 內(nèi)置的assert, chai等。只要程序拋出一個(gè)錯(cuò)誤置森,mocha就會(huì)認(rèn)為測(cè)試不通過(guò)斗埂。
const assert = require('assert') // 使用node內(nèi)置的斷言庫(kù)
describe('proxy', function(){
it('proxy data 1', function(done){
this.timeout(1000)
assert.ok(true, 'fail')
})
node assert 斷言
-
assert.fail(String | Error)
拋出一個(gè)AssertionError, 如果參數(shù)是一個(gè)Error,則會(huì)拋出這個(gè)Error。 -
assert.ifError(any)
只要any 不等于undefined | null 就拋出any -
assert.ok(value[,maessage])
測(cè)試value 是否為真值 -
assert.equal(actual, expected [,message]) | assert.notEqual(actual, expected [,message])
對(duì)actual 和 expected 執(zhí)行 == 比較 -
assert.strictEqual(actual, expected [,message]) | assert.notStrictEqual(actual, expected [,message])
對(duì)actual 和 expected 執(zhí)行 === 比較 -
assert.deepStrictEqual(actual, expected[,message]) | assert.notDeepStrictEqual()
測(cè)試是否深度全等, 執(zhí)行的是=== 比較
異步測(cè)試
- 回調(diào)形式
describe('Array', function(){
it('should correct', function(done){
setTimeout(done,1000)
})
})
如果done()執(zhí)行的時(shí)候有參數(shù)凫海,如done('錯(cuò)誤')呛凶, 那么mocha判定測(cè)試不通過(guò)。 你也可以直接傳入一個(gè)Error對(duì)象到done函數(shù)中行贪,如done(new Error('fail'))
- promise的形式
describe('Array', function(){
it('should correct', function(){
return Promise.resolve()
})
})
如果it 函數(shù)的返回值是一個(gè)promise, 將被是為是一個(gè)異步測(cè)試漾稀。并且根據(jù)promise的fullfill狀態(tài)來(lái)決定測(cè)試是否通過(guò)。
箭頭函數(shù)
mocha不提倡使用箭頭函數(shù)建瘫,因?yàn)閕t崭捍, describe都是綁定mocha context執(zhí)行的,在箭頭函數(shù)中啰脚,無(wú)法獲取到mocha context殷蛇。如以下會(huì)報(bào)錯(cuò)
describe('Array', () => {
it('shoule correct', (done) => {
this.timeout(1000) // can not read property timeout of undefind
})
})
hook
mocha 在整個(gè)測(cè)試周期中,提供了一組hook鉤子來(lái)讓開(kāi)發(fā)者在測(cè)試開(kāi)始之前準(zhǔn)備環(huán)境或者是測(cè)試完成之后清理環(huán)境橄浓。
describe('hooks', function() {
before(function() {
// runs before all tests in this block
});
after(function() {
// runs after all tests in this block
});
beforeEach(function() {
// runs before each test in this block
});
afterEach(function() {
// runs after each test in this block
});
// test cases
});
異步鉤子
在鉤子函數(shù)中傳入done粒梦,并且在異步鉤子完成時(shí)調(diào)用它。
describe('hooks', function() {
before(function(done) {
// runs before all tests in this block
setTimeout(() => {
done() // 2000ms之后才會(huì)執(zhí)行下一個(gè)鉤子
}, 2000)
})
});
mocha默認(rèn)的測(cè)試超時(shí)時(shí)間是2000ms荸实,如果你的異步鉤子準(zhǔn)備時(shí)間超過(guò)2000ms匀们,請(qǐng)事先聲明超時(shí)時(shí)間
在瀏覽器端測(cè)試
以后補(bǔ)上
vscode 插件
vscode 上面有一個(gè)輔助mocha測(cè)試的插件 mocha sidebar。
- New code coverage support
- see all tests in vscode side bar menu
- git lens for running/debugging directly form the code
- decorations which shows test status(pass/fail/not run) from code
- run tests for each level hierarchy from all tests to a single test(and each describer of course)
- debug tests for each level hierarchy from all tests to a single test(and each describer of course)
- auto run tests on file save
- see tests results directly on the code
- run/debug results directly from the code
- see test errors as decoration
- NEW add context menu on folders in explorer to set subdirectory (#2).
設(shè)置使用babel-register
在vscode的首選項(xiàng)設(shè)置如下:
"mocha.requires": ["babel-register"]
ES6 的module 語(yǔ)法
ES6的import 和 export 在node中并沒(méi)有實(shí)現(xiàn)泪勒,所以我們需要通過(guò)Babel轉(zhuǎn)換ES6的模塊語(yǔ)法昼蛀。
npm install babel@6 babel-preset-env babel-register
//.babelrc
{
"presets": ["env"]
}
現(xiàn)在你可以在啟動(dòng)時(shí)加入--require參數(shù)來(lái)讓使用了ES6 import/export語(yǔ)法的測(cè)試文件在加載時(shí)使用babel編譯宴猾。
mocha --require babel-register ./test/test.js
import _ from 'lodash'
describe('Array', function(){
it('should correct', function(){
return Promise.resolve()
})
})
如果你不使用--require參數(shù),那么你需要顯式使用babel-register
// index.js
require('babel-register')
require('./test.js')
// test.js
import _ from 'lodash'
describe('Array', function(){
it('should correct', function(){
return Promise.resolve()
})
})
// comman line
mocha ./index.js
babel-register 會(huì)在node 的require中注入一個(gè)鉤子叼旋,讓所有以.es6, .jsx, .js, .es作為后綴結(jié)尾的文件在require的時(shí)候都先經(jīng)過(guò)babel編譯仇哆。這樣子我們?cè)趇ndex.js require('./test.js')的時(shí)候,就已經(jīng)將import 語(yǔ)法轉(zhuǎn)換為requrie語(yǔ)法了夫植。