【Mocha.js 101】同步、異步與 Promise


前情提要

在上一篇文章《【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 同步更新我的原始博客。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM