測(cè)試框架 Mocha 實(shí)例教程

原作者: 阮一峰
原文地址:http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

Mocha (發(fā)音"摩卡")誕生于 2011 年岂津,是現(xiàn)在最流行的 JavaScript 測(cè)試框架之一斋竞,在瀏覽器和 Node 環(huán)境都可以自由使用富弦。

所謂"測(cè)試框架"障贸,就是運(yùn)行測(cè)試的工具窿祥。通過(guò)它,可以為 JavaScript 應(yīng)用添加測(cè)試呛讲,從而保證代碼的質(zhì)量朱嘴。

本文全面介紹如何使用 Mocha,讓你輕松上手尤蒿。如果你以前對(duì)測(cè)試一無(wú)所知郑气,本文也可以當(dāng)作 JavaScript 單元測(cè)試入門(mén)。值得說(shuō)明的是腰池,除了 Mocha 以外尾组,類(lèi)似的測(cè)試框架還有 JasmineKarma示弓、Tape 等讳侨,也很值得學(xué)習(xí)。

image

一奏属、安裝


原作者為了本文跨跨,寫(xiě)了一個(gè)示例庫(kù) Mocha-demos,清閑安裝這個(gè)庫(kù)。

$ git clone https://github.com/ruanyf/mocha-demos

如果你的電腦沒(méi)有安裝 Git囱皿,則可以直接下載 zip壓縮包勇婴,進(jìn)行解壓。

然后嘱腥,進(jìn)入 mocha-demos 目錄耕渴,在每個(gè) demo 中安裝依賴(lài)(你的電腦必須有 Node)。

$ cd mocha-demos
$ npm ** install

上面的代碼會(huì)在目錄內(nèi)部安裝 Mocha齿兔,為了操作方便萨螺,請(qǐng)?jiān)谌汁h(huán)境也安裝一下 Mocha。

$ npm install -g mocha

二愧驱、測(cè)試腳本的寫(xiě)法


Mocha 的作用是運(yùn)行測(cè)試腳本,首先必須學(xué)會(huì)寫(xiě)測(cè)試腳本椭盏。所謂"測(cè)試腳本"组砚,就是用來(lái)測(cè)試源碼的腳本。下面是一個(gè)加法模塊 add.js 的代碼掏颊。

// add.js
function add(x, y) {
  return x + y;
}

module.exports = add;

要測(cè)試這個(gè)加法模塊是否正確糟红,就要寫(xiě)測(cè)試腳本艾帐。

通常,測(cè)試腳本與所要測(cè)試的源碼腳本同名盆偿,但是后綴名為 .test.js(表示測(cè)試)或者 .spec.js(表示規(guī)格)柒爸。比如 add.js 的測(cè)試腳本名字就是 add.test.js。

// add.test.js
var add = require('./add.js');
var expect = require('chai').expect;

describe('加法函數(shù)的測(cè)試', function(){
    it('1 加 1 應(yīng)該等于 2', function(){
        expect(add(1, 1)).to.be.equal(2);
    });
});

上面這段代碼事扭,就是測(cè)試腳本捎稚,它可以獨(dú)立執(zhí)行。測(cè)試腳本里面應(yīng)該包括一個(gè)或多個(gè) describe 塊求橄,每個(gè) describe 塊應(yīng)該包括一個(gè)或多個(gè) it 塊今野。

describe 塊被稱(chēng)為"測(cè)試套件"(test suite),表示一組相關(guān)的測(cè)試罐农。它是一個(gè)函數(shù)条霜,第一個(gè)參數(shù)是測(cè)試套件的名稱(chēng)("加法函數(shù)的測(cè)試"),第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)涵亏。

it 塊被稱(chēng)為"測(cè)試用例"(test case)宰睡,表示一個(gè)單獨(dú)的測(cè)試,是測(cè)試的最小單位气筋。它是一個(gè)函數(shù)拆内,第一個(gè)參數(shù)是測(cè)試用例的名稱(chēng)("1 加 1 應(yīng)該等于 2"),第二個(gè)參數(shù)是一個(gè)實(shí)際執(zhí)行的函數(shù)裆悄。

三矛纹、斷言庫(kù)的用法


上面的測(cè)試腳本里面,有一句斷言光稼。

expect(add(1, 1)).to.be.equal(2);

所謂"斷言"或南,就是判斷源碼的實(shí)際執(zhí)行結(jié)果與預(yù)期結(jié)果是否一致,如果不一致就拋出一個(gè)錯(cuò)誤艾君。上面這句斷言的意思是采够,調(diào)用 add(1, 1) 函數(shù),結(jié)果應(yīng)該等于 2冰垄。

所有的測(cè)試用例(it塊)都應(yīng)該含有一句或多句的斷言蹬癌。它是編寫(xiě)測(cè)試用例的關(guān)鍵。斷言功能由斷言庫(kù)來(lái)實(shí)現(xiàn)虹茶,Mocha 本身不帶斷言庫(kù)逝薪,所以必須引入斷言庫(kù)。

var expect = require('chai').expect;

斷言庫(kù)有很多種蝴罪,Mocha 并不限制使用哪一種董济。上面代碼引入的斷言庫(kù)是 chai,并且指定使用它的 expect 斷言風(fēng)格要门。

expect 斷言的有點(diǎn)是很接近自然語(yǔ)言虏肾,下面是一些例子:

// 相等或不相等
expect(4 + 5).to.be.equal(9);
expect(4 + 5).to.be.not.equal(10);
expect(foo).to.be.deep.equal({ bar: 'baz' });

// 布爾值為true
expect('everthing').to.be.ok;
expect(false).to.not.be.ok;

// typeof
expect('test').to.be.a('string');
expect({ foo: 'bar' }).to.be.an('object');
expect(foo).to.be.an.instanceof(Foo);

// include
expect([1,2,3]).to.include(2);
expect('foobar').to.contain('foo');
expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');

// empty
expect([]).to.be.empty;
expect('').to.be.empty;
expect({}).to.be.empty;

// match
expect('foobar').to.match(/^foo/);

基本上廓啊,expect 斷言的寫(xiě)法都是一樣的。頭部是 expect 方法封豪,尾部是斷言方法谴轮,比如 equal、a/an吹埠、ok第步、match 等。兩者之間使用 to 或 to.be 連接藻雌。

如果 expect 斷言不成立雌续,就會(huì)拋出一個(gè)錯(cuò)誤,事實(shí)上胯杭,只要不拋出錯(cuò)誤驯杜,測(cè)試用例就算通過(guò)。

it('1 加 1 應(yīng)該等于 2', function(){});

上面的這個(gè)測(cè)試用例做个,內(nèi)部沒(méi)有任何代碼鸽心,由于沒(méi)有拋出了錯(cuò)誤,所以還是會(huì)通過(guò)居暖。

四顽频、Mocha的基本用法


有了測(cè)試腳本以后,就可以用Mocha運(yùn)行它太闺。請(qǐng)進(jìn)入 demo01 子目錄糯景,執(zhí)行下面的命令。

$ mocha add.test.js

  加法函數(shù)的測(cè)試
    ? 1 加 1 應(yīng)該等于 2

  1 passing (8ms)

上面的運(yùn)行結(jié)果表示省骂,測(cè)試腳本通過(guò)了測(cè)試蟀淮,一共只有 1 個(gè)測(cè)試用例,耗時(shí)是 8 毫秒钞澳。

mocha 命令后面緊跟測(cè)試腳本的路徑和文件名怠惶,可以指定多個(gè)測(cè)試腳本。

$ mocha file1 file2 file3

Mocha 默認(rèn)運(yùn)行 test 子目錄里面的測(cè)試腳本轧粟。所以策治,一般都會(huì)把測(cè)試腳本放在 test 目錄里面,然后執(zhí)行 mocha 就不需要參數(shù)了兰吟。請(qǐng)進(jìn)入 demo02 子目錄通惫,運(yùn)行下面的命令:

$ mocha

  加法函數(shù)的測(cè)試
    ? 1 加 1 應(yīng)該等于 2
    ? 任何數(shù)加0應(yīng)該等于自身

  2 passing (9ms)

這時(shí)可以看到,test 子目錄里面的測(cè)試腳本執(zhí)行了混蔼。但是讽膏,你打開(kāi) test 子目錄,會(huì)發(fā)現(xiàn)下面還有一個(gè) test/dir 子目錄拄丰,里面還有一個(gè)測(cè)試腳本 multiply.test.js府树,并沒(méi)有得到執(zhí)行。原來(lái)料按,Mocha 默認(rèn)只執(zhí)行 test 子目錄下面第一層的測(cè)試用例奄侠,不會(huì)執(zhí)行更下層的用例。

為了改變這種行為载矿,就必須加上 --recursive 參數(shù)垄潮,這時(shí) test 子目錄下面所有的測(cè)試用例----不管在哪一層----都會(huì)執(zhí)行。

$ mocha --recursive

  加法函數(shù)的測(cè)試
    ? 1 加 1 應(yīng)該等于 2
    ? 任何數(shù)加0應(yīng)該等于自身

  乘法函數(shù)的測(cè)試
    ? 1 乘 1 應(yīng)該等于 1

  3 passing (9ms)

五闷盔、通配符


命令行指定測(cè)試腳本時(shí)弯洗,可以使用通配符,同事指定多個(gè)文件逢勾。

$ mocha spec/{my, awesome}.js
$ mocha test/unit/*.js

上面的第一行命令牡整,指定執(zhí)行 spec 目錄下面的 my.js 和 awesome.js。第二行命令溺拱,指定執(zhí)行 test/unit 目錄下面的所有 js 文件逃贝。

除了使用 Shell 通配符,還可以使用 Node 通配符迫摔。

$ mocha 'test/**/*.@(js|jsx)'

上面代碼指定運(yùn)行 test 目錄下面任何子目錄中沐扳、文件后綴名為 js 或 jsx 的測(cè)試腳本。注意句占,Node 的通配符要放在單引號(hào)之中沪摄,否則星號(hào)(*)會(huì)先被 Shell 解釋。

上面這行 Node 通配符纱烘,如果改用 Shell 通配符杨拐,要寫(xiě)成下面這樣:

$ mocha test/{,**/}*.{js|jsx}

六、命令行參數(shù)


除了前面介紹的 --recursive凹炸,Mocha 還可以加上其他命令行參數(shù)戏阅。請(qǐng)?jiān)?demo02 子目錄里面,運(yùn)行下面的命令啤它,查看效果:

6.1 --help奕筐,-h

--help 或 -h 參數(shù),用來(lái)查看 Mocha 的所有命令行參數(shù)

$ mocha --help
6.2 --reporter, -R

--reporter 參數(shù)用來(lái)指定測(cè)試報(bào)告的格式变骡,默認(rèn)是 spec 格式择卦。

$ mocha
# 等同于
$ mocha --reporter spec

除了 spec 格式,官方網(wǎng)站還提供了其他許多報(bào)告格式毡惜。

$ mocha --reporter tap

1..2
ok 1 加法函數(shù)的測(cè)試 1 加 1 應(yīng)該等于 2
ok 2 加法函數(shù)的測(cè)試 任何數(shù)加0應(yīng)該等于自身
# tests 2
# pass 2
# fail 0

上面是 tap 格式報(bào)告的顯示結(jié)果橱健。

--reporters 參數(shù)可以顯示所有內(nèi)置的報(bào)告格式:

$ mocha --reporters

使用 mochawesome 模塊,可以生成漂亮的 HTML 格式的報(bào)告:


image
$ npm install --save-dev mochawesome
$ mocha --reporter mochawesome

上面代碼中台妆,mocha 命令使用了項(xiàng)目?jī)?nèi)安裝的版本翎猛,而不是全局安裝的版本胖翰,因?yàn)?mochawesome 模塊是安裝在項(xiàng)目?jī)?nèi)的。

然后切厘,測(cè)試結(jié)果報(bào)告就在 mochaawesome-reports 子目錄生成萨咳。

6.3 --growl,-G

打開(kāi) --growl 參數(shù)疫稿,就會(huì)將測(cè)試結(jié)果在桌面上顯示培他。

$ mocha --growl
image
6.4 --watch -W

--watch 參數(shù)用來(lái)監(jiān)視指定的測(cè)試腳本。只要測(cè)試腳本有變化遗座,就會(huì)自動(dòng)運(yùn)行 Mocha舀凛。

$ mocha --watch

上面命令行執(zhí)行以后,并不會(huì)退出途蒋。這個(gè)時(shí)候你可以另外打開(kāi)一個(gè)終端窗口猛遍,修改 test 目錄下面的測(cè)試腳本 add.test.js,比如刪除一個(gè)測(cè)試用例碎绎,一旦保存螃壤,Mocha 就會(huì)再次自動(dòng)運(yùn)行。

6.5 --bail, -b

--bail 參數(shù)指定只要有一個(gè)測(cè)試用例沒(méi)有通過(guò)筋帖,就停止執(zhí)行后面的測(cè)試用例奸晴,這對(duì)持續(xù)集成很有幫助。

$ mocha --bail
6.6 --grep, -g

--grep 參數(shù)用于搜索測(cè)試用例的名稱(chēng)(即 it 塊的第一個(gè)參數(shù))日麸,然后只執(zhí)行匹配的測(cè)試用例寄啼。

$ mocha --grep "1 加 1"

上面代碼只測(cè)試名稱(chēng)中包含"1 加 1"的測(cè)試用例。

6.7 --invert, -i

-- invert 參數(shù)表示只運(yùn)行不符合條件的測(cè)試腳本代箭,必須與 --grep 參數(shù)配合使用墩划。

$ mocha --grep "1 加 1" --invert

七、配置文件 mocha.opts


Mocha 允許在 test 目錄下面嗡综,放置配置文件 mocha.opts乙帮,把命令行參數(shù)寫(xiě)在里面。請(qǐng)先進(jìn)入 demo03 目錄极景,運(yùn)行下面的命令:

mocha --recursive --reporter tap --growl

上面這個(gè)命令有三個(gè)參數(shù) --recursive察净、--reporter tap、--growl盼樟。

然后氢卡,把這三個(gè)參數(shù)寫(xiě)入test目錄下的 mocha.opts 文件。

--reporter tap
--recursive
--growl

如果測(cè)試用例不是存放在 test 子目錄晨缴,可以在 mocha.opts 寫(xiě)入一下內(nèi)容译秦。

server-tests
--recursive

上面代碼指定運(yùn)行 server-tests 目錄及其子目錄之中的測(cè)試腳本。

八、ES6測(cè)試


如果測(cè)試腳本使用 ES6 來(lái)編寫(xiě)筑悴,那么運(yùn)行測(cè)試之前们拙,需要先用 Babel 轉(zhuǎn)碼。進(jìn)入 demo04 目錄阁吝,打開(kāi) test/add.test.js 文件睛竣,可以看到這個(gè)測(cè)試用例是用 ES6 編寫(xiě)的。

import add from '../src/add.js';
import chai from 'chai';

let expect = chai.expect;

describe('加法函數(shù)的測(cè)試', function(){
    it('1 加 1 應(yīng)該等于 2', function(){
        expect(add(1, 1)).to.be.equal(2);
    });
});

ES6 轉(zhuǎn)碼求摇,需要安裝 Babel

$ npm install babel-core babel-preset-es2015 --save-dev

然后,在項(xiàng)目目錄下面殊者,新建一個(gè) .babelrc 配置文件与境。

{
    "presets": ["es2015"]
}

最后,使用 --compilers 參數(shù)指定測(cè)試腳本的轉(zhuǎn)碼器

$ mocha --compilers js:babel-core/register

上面代碼中猖吴,--compilers 參數(shù)后面緊跟一個(gè)用冒號(hào)分隔的字符串摔刁,冒號(hào)左邊是文件的后綴名,右邊是用來(lái)處理這一類(lèi)文件的模塊名海蔽。上面代碼表示共屈,運(yùn)行測(cè)試之前,先用 babel-core/register 模塊党窜,處理一下 .js 文件拗引。由于這里的轉(zhuǎn)碼器安裝在項(xiàng)目?jī)?nèi),所以要使用項(xiàng)目?jī)?nèi)安裝的 Mocha幌衣,如果轉(zhuǎn)碼器安裝在全局矾削,就可以使用全局的 Mocha。

下面是另外一個(gè)例子豁护,使用 Mocha 測(cè)試 CoffeeScript 腳本哼凯。測(cè)試之前,先將 .coffee 文件轉(zhuǎn)成 .js 文件楚里。

$ mocha --compilers coffee:coffee-script/register

注意断部,Babel 默認(rèn)不會(huì)對(duì) Iterator、Generator班缎、Promise蝴光、Map、Set 等全局對(duì)象吝梅,以及一些全局對(duì)象的方法(比如 Object.assign)轉(zhuǎn)碼虱疏,如果你想要對(duì)這些對(duì)象轉(zhuǎn)碼,就要安裝 babel-polyfill苏携。

$ npm install --save-dev babel-polyfill

然后做瞪,在你的腳本頭部加上一行:

import 'babel-polyfill'

九、異步測(cè)試


Mocha 默認(rèn)每個(gè)測(cè)試用例最多執(zhí)行 2000 毫秒,如果到時(shí)沒(méi)有得到結(jié)果装蓬,就報(bào)錯(cuò)著拭。對(duì)于涉及異步操作的測(cè)試用例,這個(gè)時(shí)間往往是不夠的牍帚,需要用 -t 或 --timeout 參數(shù)指定超時(shí)門(mén)檻儡遮。

進(jìn)入 demo05 子目錄,打開(kāi)測(cè)試腳本 timeout.test.js:

it('測(cè)試應(yīng)該 5000 毫秒后結(jié)果', function(done){
    var x = true;
    var f = function(){
        x = false;
        expect(x).to.be.not.ok;
        done();// 通知 Mocha 測(cè)試結(jié)束
    };
    setTimeout(f, 4000);
});

上面的測(cè)試用例暗赶,需要 4000 毫秒之后鄙币,才有運(yùn)行結(jié)果。所以蹂随,需要用 -t 或 --timeout 參數(shù)十嘿,改變默認(rèn)的超時(shí)設(shè)置。

$ mocha -t 5000 timeout.test.js

上面命令將測(cè)試的超時(shí)時(shí)限指定為 5000 毫秒岳锁。

另外绩衷,上面的測(cè)試用例里面,有一個(gè) done 函數(shù)激率。it 塊執(zhí)行的時(shí)候咳燕,傳入一個(gè) done 參數(shù),當(dāng)測(cè)試結(jié)束的時(shí)候乒躺,必須顯式調(diào)用這個(gè)函數(shù)招盲,告訴 Mocha 測(cè)試結(jié)束了。否則聪蘸,Mocha 就無(wú)法知道宪肖,測(cè)試是否結(jié)束,會(huì)一直等到超時(shí)報(bào)錯(cuò)健爬。你可以把這行代碼刪除試試看控乾。

Mocha 默認(rèn)會(huì)高亮顯示超過(guò) 75 毫秒的測(cè)試用例,可以用 -s 或 --slow 調(diào)整這個(gè)參數(shù)娜遵。

$ mocha -t 5000 -s 1000 timeout.test.js

上面命令指定高亮顯示耗時(shí)超過(guò) 1000 毫秒的測(cè)試用例蜕衡。

下面是另外一個(gè)異步測(cè)試的例子 async.test.js

it('異步請(qǐng)求應(yīng)該返回一個(gè)對(duì)象', function(done){
    request.get('https://api.github.com')
        .end(function(err, res){
            expect(res).to.be.an('object');
            done();
        });
});

運(yùn)行下面命令,可以看到這個(gè)測(cè)試會(huì)通過(guò)设拟。

$ mocha -t 10000 async.test.js

另外慨仿,Mocha 內(nèi)置對(duì) Promiss 的支持,允許直接返回 Promiss纳胧,等到它的狀態(tài)改變镰吆,在執(zhí)行斷言,而不用顯示調(diào)用 done 方法跑慕。請(qǐng)看 promise.test.js万皿。

it('異步請(qǐng)求應(yīng)該返回一個(gè)對(duì)象', function(){
    return fetch('https://api.github.com')
        .then(function(res){
            return res.json();
        }).then(function(json){
            expect(json).to.be.an('object');
        });
});

十摧找、測(cè)試用例的鉤子


Mocha 在 describe 塊之中,提供測(cè)試用例的四個(gè)鉤子:before()牢硅、after()蹬耘、beforeEach()、afterEach()减余。它們會(huì)在指定的時(shí)間執(zhí)行综苔。

describe('hooks', function(){
    
    before(function(){
        // 在本區(qū)塊的所有測(cè)試用例之前執(zhí)行
    });

    after(function() {
        // 在本區(qū)塊的所有測(cè)試用例之后執(zhí)行
    });

    beforeEach(function() {
        // 在本區(qū)塊的每個(gè)測(cè)試用例之前執(zhí)行
    });

    afterEach(function() {
        // 在本區(qū)塊的每個(gè)測(cè)試用例之后執(zhí)行
    });

    // test cases
});

進(jìn)入 demo06 子目錄,可以看到下面兩個(gè)例子位岔。首先是 beforeEach 的例子 beforeEach.test.js如筛。

// beforeEach.test.js
describe('beforeEach示例', function() {
  var foo = false;

  beforeEach(function() {
    foo = true;
  });

  it('修改全局變量應(yīng)該成功', function() {
    expect(foo).to.be.equal(true);
  });
});

上面代碼中,beforeEach 會(huì)在 it 之前執(zhí)行抒抬,所以會(huì)修改全局變量妙黍。

另一個(gè)例子 beforeEach-async.test.js 則是演示,如何在 beforeEach 之中使用異步操作瞧剖。

// beforeEach-async.test.js
describe('異步 beforeEach 示例', function(){
    var foo = false;

    beforeEach(function(done){
        setTimeout(function(){
            foo = true;
            done();
        }, 50);
    });

    it('全局變量異步修改應(yīng)該成功', function(){
        expect(foo).to.be.equal(true);
    });
});

十一、測(cè)試用例管理


大型項(xiàng)目有很多測(cè)試用例可免。有時(shí)抓于,我們希望只運(yùn)行其中的幾個(gè),這時(shí)可以用 only 方法浇借。 describe 塊和 it 塊都允許調(diào)用 only 方法捉撮,表示只運(yùn)行某個(gè)測(cè)試套件或測(cè)試用例。

進(jìn)入 demo07 子目錄妇垢,測(cè)試腳本 test/add.test.js 就使用了 only巾遭。

it.only('1 加 1 應(yīng)該等于 2', function(){
    expect(add(1, 1)).to.be.equal(2);
});

it('任何數(shù)加0應(yīng)該等于自身', function() {
    expect(add(1, 0)).to.be.equal(1);
});

上面代碼中,只有帶有 only 方法的測(cè)試用例會(huì)運(yùn)行:

$ mocha test/add.test.js

  加法函數(shù)的測(cè)試
    ? 1 加 1 應(yīng)該等于 2

  1 passing (10ms)

此外闯估,還有 skip 方法灼舍,表示跳過(guò)指定的測(cè)試套件或測(cè)試用例。

it.skip('任何數(shù)加0應(yīng)該等于自身', function(){
    expect(add(1, 0)).to.be.equal(1);
});

上面代碼的這個(gè)測(cè)試用例不會(huì)執(zhí)行涨薪。

十二骑素、瀏覽器測(cè)試


除了在命令行運(yùn)行,Mocha 還可以在瀏覽器運(yùn)行


image

首先刚夺,使用 mocha init 命令在指定目錄生成初始化文件献丑。

$ mocha init demo08

運(yùn)行上面命令,就會(huì)在 demo08 目錄下生成 index.html 文件侠姑,以及配套的腳本和樣式表创橄。

<!DOCTYPE html>
<html>
    <body>
        <h1>Unit.js test in the browser with Mocha</h1>
        <div id="mocha"></div>
        <script type="text/javascript" src="mocha.js"></script>
        <script type="text/javascript">
            mocha.setup('bdd');
        </script>
        <script type="text/javascript" src="tests.js"></script>
        <script type="text/javascript">
            mocha.run();
        </script>
    </body>
</html>

然后,新建一個(gè)源碼文件 add.js:

// add.js
function add(x, y){
    return x + y;
}

然后莽红,把這個(gè)文件妥畏,以及斷言庫(kù) chai.js,加入 index.html;

<script type="text/javascript">
    mocha.setup('bdd');
</script>
<script type="text/javascript" src="http://chaijs.com/chai.js"></script>
<script type="text/javascript" src="tests.js"></script>
<script type="text/javascript">
    mocha.run();
</script>

最后咖熟,在 tests.js 里面寫(xiě)入測(cè)試腳本圃酵。

var expect = chai.expect;

describe('加法函數(shù)的測(cè)試', function(){
    it('1 加 1 應(yīng)該等于 2', function(){
        expect(add(1, 1)).to.be.equal(2);
    });

    it('任何數(shù)加0應(yīng)該等于自身', function(){
        expect(add(1, 0)).to.be.equal(1);
        expect(add(0, 0)).to.be.equal(0);
    });
});

現(xiàn)在,在瀏覽器里面打開(kāi) index.html馍管,就可以看到測(cè)試腳本的運(yùn)行結(jié)果郭赐。

十三、生成規(guī)格文件


Mocha 支持從測(cè)試用例生成規(guī)格文件确沸。


image

進(jìn)入 demo09 子目錄捌锭,運(yùn)行下面的命令:

$ mocha --recursive -R markdown > spec.md

上面命令根據(jù) test 目錄的所有測(cè)試腳本,生成一個(gè)規(guī)格文件 spec.md罗捎。-R markdown 參數(shù)指定規(guī)格報(bào)告是 markdown 格式观谦。

如果想生成 HTML 格式的報(bào)告 spec.html,使用下面的命令:

$ mocha --recursive -R doc > spec.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桨菜,一起剝皮案震驚了整個(gè)濱河市豁状,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倒得,老刑警劉巖泻红,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異霞掺,居然都是意外死亡谊路,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)菩彬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缠劝,“玉大人,你說(shuō)我怎么就攤上這事骗灶〔夜В” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵耙旦,是天一觀的道長(zhǎng)喉恋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)母廷,這世上最難降的妖魔是什么轻黑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮琴昆,結(jié)果婚禮上氓鄙,老公的妹妹穿的比我還像新娘。我一直安慰自己业舍,他們只是感情好抖拦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布升酣。 她就那樣靜靜地躺著,像睡著了一般态罪。 火紅的嫁衣襯著肌膚如雪噩茄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天复颈,我揣著相機(jī)與錄音绩聘,去河邊找鬼。 笑死耗啦,一個(gè)胖子當(dāng)著我的面吹牛凿菩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帜讲,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衅谷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了似将?” 一聲冷哼從身側(cè)響起获黔,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎在验,沒(méi)想到半個(gè)月后肢执,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡译红,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兴溜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侦厚。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拙徽,靈堂內(nèi)的尸體忽然破棺而出刨沦,到底是詐尸還是另有隱情,我是刑警寧澤膘怕,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布想诅,位于F島的核電站,受9級(jí)特大地震影響岛心,放射性物質(zhì)發(fā)生泄漏来破。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一忘古、第九天 我趴在偏房一處隱蔽的房頂上張望徘禁。 院中可真熱鬧,春花似錦髓堪、人聲如沸送朱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驶沼。三九已至炮沐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間回怜,已是汗流浹背大年。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹉戚,地道東北人鲜戒。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抹凳,于是被迫代替她去往敵國(guó)和親遏餐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容