如何使用 chai 断言库进行 Mocha 测试

前言

Mocha 是一个JavaScript测试框架,常用于Node.js应用程序和浏览器。它让异步测试变得真正简单且有趣。chai 是一个适用于BDD / TDD的断言库。这篇文章将详细介绍如何使用chai库进行mocha测试。

安装

首先,你需要安装Mocha和Chai.

--- ------- ----- ---- ----------

语法

Chai有两个接口能用于编写测试用例:assert和expect.

assert机制在使用上有点类似Node.js内建的assert机制,可以根据条件是否成立来抛出异常或者不同的输出信息。

expect机制是一种更加接近人类自然语言的断言方式,更加浅显易懂。

使用assert机制

assert机制,用于判断代码运行结果是否符合预期。assert的常用api如下所示。

equal(), notEqual()

equal()的两个参数如果比较结果不相等,直接报错;

notEqual()的两个参数如果比较结果相等,直接报错。

--- ------ - -----------------------
--- --- - -----
----------------- ------ ---- ----- --------
-------------------- ------ ---- --- ----- --------

isTrue(), isFalse()

判断参数是否为true/false,用于判断布尔值和相等性

    --- ------ - -----------------------
    --- ------ - ----
    ----------------------
    ------------------------

throw()

该方法需要一个作为函数参数的函数,如果抛出错误就表示测试成功。

    --- ------ - -----------------------
    ------------------
        ----- --- ------------ -----------
    -- ------

typeOf()

判断变量的数据类型是否正确。

    --- ------ - -----------------------
    --- ------ - --
    --- ------ - ------
    --- --- - --------
    --- --- - --- -- -- -----
    --- ---- - -----
    --- -- - ------
        ------------------ ------
    --
    --------------------- ----------
    --------------------- ----------
    ------------------ ---------
    ------------------ ----------
    ------------------- -----------
    ----------------- ------------

notTypeOf()

除了typeOf方法来判断变量的数据类型,还可以用notTypeOf进行补充。

    --- ------ - -----------------------
    --- ------ - --
    --- ------ - ------
    --- --- - --------
    --- --- - --- -- -- -----
    --- ---- - -----
    --- -- - ------
        ------------------ ------
    --
    ------------------------ ----------
    ------------------------ ----------
    --------------------- ----------
    --------------------- ---------
    ---------------------- ------------
    -------------------- ---------

instanceOf()

检测变量是否是构造函数的实例。

    --- ------ - -----------------------
    --- --- - --- -- -- -----
    --- --- - --------
    --- --- - -----
        ----- --- ------------ -----------
    -
    ---------------------- --------
    ---------------------- -------
    ---------------------- ----------

notInstanceOf()

补充instanceOf方法的不足。

    --- ------ - -----------------------
    --- --- - --- -- -- -----
    --- --- - --------
    --- --- - -----
        ----- --- ------------ -----------
    -
    ------------------------- -------
    ------------------------- -------
    ------------------------- --------

使用expect机制

expect机制,是api接口简单易懂,使用自然语言描述测试目的以及是否通过。 从下面的例子里,可以感受到这种简单、直观的测试方式。

expect().to.equal()

检测两个变量是否相等。

    --- ------ - -----------------------
    --- --- - -----

    ----------------------------

expect().to.not.equal()

补充expect().to.equal()方法。

    --- ------ - -----------------------
    --- --- - -----

    --------------------------------

expect().to.be.a()

检测变量的数据类型。

    --- ------ - -----------------------
    --- ------ - --
    --- ------ - ------
    --- --- - --------
    --- --- - --- -- -- -----
    --- ---- - -----
    --- -- - ------
        ------------------ ------
    --
    ---------------------------------
    ---------------------------------
    -----------------------------
    ------------------------------
    --------------------------------
    -------------------------------

expect().to.not.be.a()

补充expect().to.be.a()方法的不足。

    --- ------ - -----------------------
    --- ------ - --
    --- ------ - ------
    --- --- - --------
    --- --- - --- -- -- -----
    --- ---- - -----
    --- -- - ------
        ------------------ ------
    --
    -------------------------------------
    ------------------------------------
    ----------------------------------
    ---------------------------------
    -------------------------------------
    ---------------------------------

expect().to.include()

判断字符串或数组中是否包含特定的子字符串或元素。

    --- ------ - -----------------------
    --- ------ - ------ -------
    --- --- - ------------

    -----------------------------------
    --------------------------

expect().to.not.include()

补充expect().to.include()方法。

    --- ------ - -----------------------
    --- ------ - ------ -------
    --- --- - ------------

    ---------------------------------------
    ------------------------------

expect().to.have.lengthOf()

检测字符串或数组长度是否符合预期。

    --- ------ - -----------------------
    --- ------ - ------
    --- --- - --------

    -----------------------------------
    --------------------------------

expect().to.not.have.lengthOf()

补充expect().to.have.lengthOf()方法。

    --- ------ - -----------------------
    --- ------ - --------
    --- --- - --------

    ---------------------------------------
    ------------------------------------

expect().to.throw()

如果函数throw一个错误,则判断它是否符合预期。

    --- ------ - -----------------------

    ------------
        ----- --- ------------ -----------
    ------------------

expect().to.not.throw()

补充expect().to.throw()方法。

    --- ------ - -----------------------
    --- -- - ------
        ------------------ ------
    --

    ------------------------------

Mocha测试实例

假设A+的写法如下

-------- ----------- -
    --- ----- - ----------
    --- ----- - -----
    --- --------- - ---

    --------- - --------------------- -
        ------ --- ------------------------- -
            --------
                ------------ ----------- -- -----
                -------- -------
            ---
        ---
    --

    -------- ---------------- -
        -------- --- ---------- -
            -------------------------
            -------
        -
        --- --- - ----------------------------
        ----------------------
    -

    -------- ----------------- -
        ----------- -- ----------------- --- -------- -- ---------------- --- ------------ -
            --- ---- - --------------
            --------- ---- --- ----------- -
                ------------------- ---------
                -------
            -
        -
        ----- - ---------
        ----- - ------------
        --------------------- -
            ------------------------------------ -
                -----------------
            ---
        -- ---
    -

    ------------
-

针对Promise类进行测试代码如下

--- ------ - ------------------
--- ------- - --------------------------

------------------- ---------- -
    ------------------- ---------- -
        ---------- ------- ----- -- --- ---- ------ -------------- -
            --- ------- - --- ------------------------- -
                -----------------
            ---

            -------
            ------------------- -
                ----------------- ---------
                ------ -------
            --
            ------------------- -
                ----------------- ---------
                -------
            ---
        ---

        ---------- ------- ----- -- ---- ---- -- ------ ------- -------- -------------- -
            --- ------- - --- ------------------------- -
                -----------------
            ---

            -------
            ------------------- -
                ----------------- ---------
                ------ --- ------------------------- -
                    ----------- ------------------------- -
                        -----------------
                    ----
                --
            --
            ------------------- -
                ----------------- ---------
                -------
            ---
        ---
    ---
---

结论

断言库让mocha测试变得更具生产力。chai库正如它的口号一样:“又快又简单”,用它可以让你不仅更加专注于测试本身,还有语法明确且易于阅读,填充了JS测试的空白,丰富了JS单元测试的处理方式。在进行mocha单元测试时,使用chai断言库能让我们静下心来,更好的将精力放到测试本身,减少因为简单的测试而浪费时间的现象。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6728a96f2e7021665e210bce