前情提要
在上一篇文章《【Mocha.js 101】Mocha 入門指南》中,我們提到了如何用 Mocha.js 進行前端自動化測試,並做了幾個簡單的例子來體驗 Mocha.js 給我們帶來的便利。
在本篇文章中,我們將了解到 Mocha.js 的同步/異步測試,以及如何測試 Promise。
同步代碼測試
在上一篇文章中,其實我們已經學會了如何測試同步代碼。今天,我們 BDD 風格編寫一個測試:
var should = require( 'should' ); var Calculator = require( '../../src/chapter0/Calculator' ); // 描述 Calculator 的行為 describe( 'Calculator', function () { // 描述 Calculator.add 方法的行為 describe( '#add', function () { // 1 + 2 = 3 的行為 it( '1 + 2 = 3', function () { Calculator.add( 1, 2 ).should.equal( 3 ); } ); // 2 - 1 = 1 的行為 it( '2 - 1 = 1', function () { Calculator.minus( 2, 1 ).should.equal( 1 ); } ); } ); } );
在上一篇文章中,我們已經介紹過常用的斷言庫,Should.js 就是其中之一。上述代碼中,便使用 Should.js 實現了 BDD 風格的斷言。
接下來,我們執行測試:
$ mocha test/chapter1/synchronous.js
我們將會看到如下輸出:
Calculator #add ✓ 1 + 2 = 3 ✓ 2 - 1 = 1 2 passing (9ms)
異步代碼(回調)測試
說道 JavaScript,必然少不了回調函數。從前端 Ajax 通信,到 Node.js 異步數據訪問,回調函數貫穿了整個 JavaScript 生命周期。
那么,我們如何對回調式的方法進行測試呢?首先,我們先編寫一個模擬業務邏輯類。創建 src/chapter1/Ajax.js ,並填入一些樁代碼:
var Ajax = { load: function ( url, callback ) { callback.call( this, url ); } }; module.exports = Ajax;
上述代碼模擬了 Ajax 異步調用。調用 load 函數,傳入請求 URL 和成功回調函數,來模擬 Ajax 的異步請求。
接下來,我們來為上面的代碼編寫測試。Mocha.js 能夠很輕松的實現異步方法的測試,我們只需要在 it 方法中加上 done 形參即可。
我們創建 test/chapter1/asynchronous.js 文件,並加入測試代碼:
var should = require( 'should' ); var Ajax = require( '../../src/chapter1/Ajax' ); // 描述 'Ajax' 的行為 describe( 'Ajax', function () { // 描述 'Ajax.load()' 方法的行為. describe( '#load()', function () { // 加載成功后執行回調函數, 獲取結果. it( 'should return the load result.', function ( done ) { Ajax.load( 'url', function ( result ) { result.should.equal( 'url' ); done(); } ); } ); } ) } );
代碼 11 行定義了形式參數 done ,Mocha.js 將會檢測是否定義了形參,如果定義了形參,則將會等待形參調用。
代碼 14 行調用了 done() ,即表示測試執行成功,Mocha.js 將會輸出成功結果。
下面,我們執行這個測試來看看:
mocha test/chapter1/asynchronous.js
將會得到如下輸出結果:
Ajax #load() ✓ should return the load result. 1 passing (9ms)
Promise 測試
由於 ES 2015 的推行,Promise 成為了各大框架不可或缺的一部分。Promise 的出現讓一個個嵌套的回調函數變得竟然有序,為 JavaScript 扛起了異步處理的新旗幟。(本文並不主要介紹 Promise,所以相關內容可以去查看閱讀擴展部分)
就像回調函數測試一樣,Mocha.js 對 Promise 測試支持非常簡單:只需要返回一個 Promise 對象即可。
同樣,我們先來創建業務邏輯代碼:
var DB = { save: function ( object ) { return new Promise( function ( resolve, reject ) { resolve(); } ); } }; module.exports = DB;
上述代碼模擬了數據庫操作,在保存方法中,返回一個 Promise,來實現異步存儲。
接下來,我們創建 test/chapter1/promise.js 文件,來編寫測試代碼:
var should = require( 'should' ); var DB = require( '../../src/chapter1/DB' ); // 描述 'DB' 的行為 describe( 'DB', function () { // 描述 'DB.save()' 方法的行為. describe( '#save()', function () { // 保存成功后執行 Promise.then it( 'save without error.', function () { return DB.save( 'test' ); } ); } ) } );
12 行直接將 save 方法返回的 Promise 對象返回給 Mocha.js。Mocha.js 將會根據 Promise 的結果,來裁決測試是否成功。
如果 Promise resolve:
DB #save() ✓ save without error. 1 passing (8ms)
如果 Promise reject:
DB #save() 1) save without error. 0 passing (10ms) 1 failing 1) DB #save() save without error.: Error: Promise rejected with no or falsy reason
總結
本文介紹了 Mocha.js 同步、異步,以及 Promise 的測試方法。Mocha.js 是一個非常優秀的框架,其對回調函數、Promise 的支持,讓我們能夠很輕松的實現異步代碼的自動化測試。
下一篇文章中,我們將會對 Mocha.js 的 Hooks(鈎子) 進行介紹,歡迎大家繼續關注~
本文以 CC BY-NC-SA 3.0 CN 協議共享,轉載、共享及二次創作時請保留原文出處及鏈接,請勿用於商業用途。
本文鏈接:http://litecodes.com/dev/frontend/mocha-101-sync-async-and-promise/
Cnblogs 同步更新我的原始博客。