Chai是一个流行的JavaScript测试框架,它是一个用构建BDD和TDD测试的断言库。Chai与Mocha配合使用,它可以让测试更加直观且易于理解。本文将会介绍Chai模块的内部实现,它将涉及以下的内容:
- Chai的安装和常用断言
- Chai的内部实现
- 纯Javascript断言的实现
Chai的安装和常用断言
安装Chai非常简单,只需在命令行中执行以下命令:
npm install --save-dev chai
Chai中最常用的断言是expect
和should
。下面是它们的基本用法:
-- -------------------- ---- ------- ----- - ------ - - --------------- ----- - ------ - - ---------------- ----- ------ - ----------------------- -- -------- ---- ------------------------ -- -------- ---- ------------------------ -- -------- ---- --------------------
在上面的例子中,我们分别展示了expect
和should
两种风格的写法。expect
式风格是Chai中最常用的风格,因为它可以链式调用多个断言。而should
式风格可以将chai的断言添加到Object.prototype上。
Chai的内部实现
Chai的内部实现基于AssertionError
异常类,每个异常对象都包含一个message
属性来描述期望是什么,实际是什么的值。Chai库的主要构造块是expect
的返回对象,它由Expectation
类提供。
在Chai中,我们使用的主要是expect()
函数。该函数返回了一个Expectation
对象,这个对象可以被用于断言的各种调用。
function expect(target) { return new Expectation(target); }
Expectation
类封装了期望和实际的值,并在需要时将它们传递给assert
函数进行比较。每个Expectation
对象都要做的任务是构建成一条断言链。
-- -------------------- ---- ------- ----- ----------- - ------------------- ----- - -- - ----------- - ------- -- ---- --------------- - --- -- ---------- ----------- - ------ -- ------- -------- - ---------------- ----------- - ------ - ------------ -------- - -- -------------------- --- ----------- - -- ------------ -- ---------------------- - -- - -------------------------------------- - --------- - ----- ----------- - ------ - --------------------- --- ---------------------- -------- ------------------- -- ------ --- ------------------------ ---------------------- - --- - ----------- - ------ ------ --------------- ------ --------- - -
Expectation
对象会把当前期望对象的链式调用编程数组,并利用Invoke chaining
模式将这段期望的链式调用的各种属性最终注入给了Assertion
类。其中,Assertion
类提供了大多数加载断言的期望值,它是一个有灵活性和易于阅读的工具,如下所示:
-- -------------------- ---- ------- -------- ----------------- -------- ------- - -- ----------------- --- - -- ------ ------- --- ---------- - ------ - -------- ------- - ----- - ------------ - --- -------- - ------- ---------- - --- ------------ - -------- ----------- - ------- --------------- - ----- ---------------- - ------ --------------------------- ---- - ----- - ------ ----------- - -------- - ----- - --- -
在该构造函数中,断言的目标对象与附加消息和否定标志一起传递进来,除此之外还会有一些可选的计算属性和实用功能,例如不完整的错误输出和对象比较。
Assertion
类中的to
和not
方法分别用来实现断言和反断言。
-- -------------------- ---- ------- ---------------------- - -------- --------- - ---------------- - ----- ----------- - ------ --------------- ------ ------ ----- -- ----------------------- - -------- --------- - ---------------- - ----- ----------- - ----- ---------------- ------ ------ ----- --
纯Javascript断言的实现
除了Chai可以提供的“expect”、“should”和“assert”之外,纯JavaScript也支持断言这种技术。
下面是一个简单的纯JavaScript断言:
function assert(condition, failMessage) { if (!condition) { throw new Error(failMessage); } }
使用纯JavaScript可以实现自定义错误,它能得到更加精确的错误描述:
function assert(condition, failMessage) { if (!condition) { throw new Error(`Expected ${failMessage} to be true, but got ${condition}`); } }
虽然Chai提供了更多的断言和表达的语义,但是纯JavaScript断言起来更加轻量级且具有合理的性能。
总结
本文探讨了Chai模块的内部实现。我们简要概括了Chai模块的安装和常用断言,并深入介绍了Chai的实现方式。最后还介绍了一些纯JavaScript断言的实现方式。希望这篇文章可以帮助开发人员更好地使用Chai进行测试,并提供了查看关于测试实现的思考方式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648fdcdc48841e9894e013ca