【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 同步更新我的原始博客。

时间: 2024-07-30 13:42:01

【Mocha.js 101】同步、异步与 Promise的相关文章

Node.js 101(2): Promise and async

--原文地址:http://blog.chrisyip.im/nodejs-101-package-promise-and-async 先回想一下 Sagase 的项目结构: lib/ cli.js sagase.js Gruntfile.js package.json 上一篇讲了 package.json,这一篇讲 lib/sagase.js. 由于代码比較长,就分开一节节地讲,完整的点开 GitHub 看吧. 'use strict'; 通知编译器进入 strict mode,基本的作用是让

js的线程和同步异步以及console.log机制

项目上线了,闲下来就写写东西吧.积累了好多东西都没有做笔记~挑几个印象深刻的记录一下吧. js的同步异步以及单线程问题: 都知道单线程是js的一大特性.但是通常io(ajax获取服务器数据).用户/浏览器自执行事件(onclick.onload.onkeyup等等)以及定时器(setTimeout.setInterval)这些异步操作又是怎样工作的呢. 我们把js的任务分为两种:同步任务,异步任务: 举个例子吧:   let a=1; console.log("同步任务"): setT

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

【Javascript】Js同步异步以及回调函数

一.前言 今天查看了requireJs方面的知识,看着看着就看到了JS中同步与异步操作的知识点,经过查阅了很多的资料,基本了解了JS的同步与异步的操作,其中涉及到的知识点如下: 什么时同步和异步? JS的是基于事件驱动的单线程语言,为啥会有异步操作这种多线程的操作??? 浏览器线程,浏览器内核线程间的合作? JS的异步操作都有哪些?它是如何工作的? 二.js单线程 JS的单线程 单线程的含义是js只能在一个线程上运行,也就是说,同一时间只能做一件事情,其他的任务则会放在任务队列里面排队等等js线

js同步-异步-回调

出处:https://blog.csdn.net/u010297791/article/details/71158212(1)上面主要讲了同步和回调执行顺序的问题,接着我就举一个包含同步.异步.回调的例子. let a = new Promise(//声明了一个Promise回调函数,能够使用then function(resolve, reject) { console.log(1) setTimeout(() => console.log(2), 0) console.log(3) cons

ajax 的同步异步 、js 的异步

同步:在程序运行的时候,是从上而下的,只要上面的代码没运行完成,会阻塞下面的代码运行,只有上面的程序执行完,下面的代码才会运行. 异步:上面的代码没运行完,不会阻塞下面的代码运行. xxx.open( ):例子:xxx.open("get","/sleep?name=" + encodeURI(this.value)+ "&id=" + Date.now(), true) 第一个参数:"get" 或者 "po

单线程,同步异步,阻塞非阻塞的理解

一.概念理解 1.同步异步: 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果.而是在*调用*发出后,*被

JS中的异步以及事件轮询机制

一.JS为何是单线程的? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊.(在JAVA和c#中的异步均是通过多线程实现的,没有循环队列一说,直接在子线程中完成相关的操作) JavaScript的单线程,与它的用途有关.作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM.这决定了它只能是单线程,否则会带来很复杂的同步问题.比如,假定JavaScript同时有两个线程,一个

mocha.js

mocha 如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生. 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 比如对函数abs(),我们可以编写出以下几个测试用例: 输入正数,比如1.1.2.0.99,期待返回值与输入相同: 输入负数,比如-1.-1.2.-0.99,期待返回值与输入相反: 输入0,期待返回0: 输入非数值类型,比如null.[].{},期待抛出Error. 把上面的测试用例放到一个测试模块里,就