Chai 断言库的详细使用教程

阅读时长 5 分钟读完

在编写前端代码时,测试是非常重要的一环,而 Chai 是一个非常流行的断言库。本文将详细介绍 Chai 的使用方法,包括断言的基本使用、链式调用、异步测试以及自定义断言等内容。

断言的基本使用

在使用 Chai 进行断言时,我们首先需要引入 Chai:

然后就可以进行简单的断言了。例如,我们要判断一个变量的值是否等于 5:

我们使用 expect 构造函数创建了一个断言对象,并使用 to 属性来表达我们所期待的结果。在上述代码中,我们期待变量 a 的值为 5,因此使用 to.equal(5) 来进行断言。

这里需要注意的是,Chai 提供了多种不同的可链式的语法,我们同样可以使用 assert 函数来达到相同的效果:

这两种方式的效果是相同的。

链式调用

Chai 内置支持链式调用,可以使我们的测试代码更为简洁。例如:

在这个例子中,我们对一个字符串进行了两种断言,首先使用 to.be.a 确定其类型为字符串,然后使用 and.include 断言包含字符串 "world"。

具体而言,我们可以使用 to 来表达期望结果,然后连接可链式调用的其他属性,包括:

  • aan,表示期望对象的类型;
  • includecontain,表示期望值包含某个子值;
  • equalequals,表示期望值等于(全等,即使用 === 判断)某个值;
  • abovegreaterThan,表示期望值大于某个值;
  • belowlessThan,表示期望值小于某个值;
  • match,表示期望值匹配某个正则表达式。

这些方法之间完全可以链式调用,从而达到简洁的效果。

异步测试

异步代码的测试是前端测试中的一个重要部分,而 Chai 也内置支持异步测试。

在测试异步代码时,我们首先需要向 Mocha 框架传入一个回调函数 done,用于表示异步操作的结束。当我们测试异步代码的返回值时,我们需要在断言中使用 eventually,例如:

在上述例子中,我们使用了 setTimeout 函数模拟了异步操作,使用 expect 断言表达式 getHello() 应返回字符串 'hello'。其中,关键字 eventually 可以告知 Chai 我们正在测试异步代码,并等待其返回结果。

自定义断言

当我们使用 Chai 进行断言时,有时我们需要定义自己的断言。例如,我们希望对数组进行断言,判断其每个元素是否都是偶数:

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

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

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

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

在上述代码中,我们编写了一个新的断言函数 allEvenNumbers,并使用了 Chai 断言库使其可以拥有链式调用的语法。其中,我们使用了 chai.Assertion 构造函数创建了一个新的断言对象,并使用了 new 操作符显式创建了这个对象。

然后,我们首先使用 to.be.an 确定对象为数组类型,然后使用 forEach 方法对数组中的每一个元素进行断言。在这里,我们使用 new chai.Assertion(num).to.be.a 创建了一个新的断言对象,并判断这个值是一个数字(.to.be.a('number')),并且是偶数(.that.is.even)。

最后,我们使用了 expect 函数来对两个数组进行断言,其中对于符合预期的结果,我们使用 not.to.throw 表达式,而对于不符合预期的结果,我们使用了 to.throw 表达式。

结论

在本文中,我们详细介绍了 Chai 断言库的使用方法,包括了基本使用、链式调用、异步测试以及自定义断言等内容。使用 Chai 可以大大简化我们的测试工作,希望本文对您有所帮助。

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

纠错
反馈