Chai 模块的内部实现

阅读时长 6 分钟读完

Chai是一个流行的JavaScript测试框架,它是一个用构建BDD和TDD测试的断言库。Chai与Mocha配合使用,它可以让测试更加直观且易于理解。本文将会介绍Chai模块的内部实现,它将涉及以下的内容:

  • Chai的安装和常用断言
  • Chai的内部实现
  • 纯Javascript断言的实现

Chai的安装和常用断言

安装Chai非常简单,只需在命令行中执行以下命令:

Chai中最常用的断言是expectshould。下面是它们的基本用法:

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


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

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

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

在上面的例子中,我们分别展示了expectshould两种风格的写法。expect式风格是Chai中最常用的风格,因为它可以链式调用多个断言。而should式风格可以将chai的断言添加到Object.prototype上。

Chai的内部实现

Chai的内部实现基于AssertionError异常类,每个异常对象都包含一个message属性来描述期望是什么,实际是什么的值。Chai库的主要构造块是expect的返回对象,它由Expectation类提供。

在Chai中,我们使用的主要是expect()函数。该函数返回了一个Expectation对象,这个对象可以被用于断言的各种调用。

Expectation类封装了期望和实际的值,并在需要时将它们传递给assert函数进行比较。每个Expectation对象都要做的任务是构建成一条断言链。

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

Expectation对象会把当前期望对象的链式调用编程数组,并利用Invoke chaining模式将这段期望的链式调用的各种属性最终注入给了Assertion类。其中,Assertion类提供了大多数加载断言的期望值,它是一个有灵活性和易于阅读的工具,如下所示:

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

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

在该构造函数中,断言的目标对象与附加消息和否定标志一起传递进来,除此之外还会有一些可选的计算属性和实用功能,例如不完整的错误输出和对象比较。

Assertion类中的tonot方法分别用来实现断言和反断言。

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

纯Javascript断言的实现

除了Chai可以提供的“expect”、“should”和“assert”之外,纯JavaScript也支持断言这种技术。

下面是一个简单的纯JavaScript断言:

使用纯JavaScript可以实现自定义错误,它能得到更加精确的错误描述:

虽然Chai提供了更多的断言和表达的语义,但是纯JavaScript断言起来更加轻量级且具有合理的性能。

总结

本文探讨了Chai模块的内部实现。我们简要概括了Chai模块的安装和常用断言,并深入介绍了Chai的实现方式。最后还介绍了一些纯JavaScript断言的实现方式。希望这篇文章可以帮助开发人员更好地使用Chai进行测试,并提供了查看关于测试实现的思考方式。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648fdcdc48841e9894e013ca

纠错
反馈