Chai 库中 expect 和 should 使用总结
在前端开发中,进行单元测试是一个十分重要的环节。而 Chai 是其中一个广受欢迎的断言库,它可以帮助我们断言测试结果是否符合预期,进而保证代码的可靠性和稳定性。而 Chai 库中的 expect 和 should 这两个断言方法是我们必须掌握的关键技能。
一、Chai 库
Chai 是一个 JavaScript 断言库,适用于 Node.js 和浏览器环境。它使得编写单元测试变得简单、流畅且有表达力。Chai 支持 BDD (Behavior Driven Development)、TDD (Test Driven Development) 和所谓的“支持性断言”。
相比其他断言库,Chai 有如下优势:
1.断言表达式友好:Chai 提供了自然语言风格的断言表达式,使得你的代码透露了测试意图和测试表达,即使是非技术人员也能够看懂。
2.不同的风格:Chai 提供了 expect、should 和 assert 三种断言风格。要求是,我可以轻松地编写符合我的编码风格的断言。关于 expect 和 should,详见下文。
3.可扩展度:Chai 通过提供 plugin API,支持自定义断言,因此可以更好地满足不同的业务需求。
二、expect
expect 是 Chai 中最常用、最管用的的断言方法。expect 方法包含以下三个组成部分:
1.基本语法:expect(value) 会产生一个断言对象,可以使用一系列所谓的“断言词”进行比较,比较范围可以是基础类型、对象和数组。
2.断言词:包括 to、be、been、is、that、which、and、has、have、with、at、of、same,基本涵盖了我们需要比较的情况。
3.产生结果:每一个 expect 对象都有一个 assert 方法来生成结果,如果 value 不符合断言词的条件,进行比较测试,那么就会抛出 AssertionError。
expect 的常用语句格式如下:
expect(value).to.xxx([args...])
其中,value 是我们要被测试的值,to 是断言词,xxx 则是需要使用的方法。接下来我们看两个实例进行讲解。
例1:基础类型的测试
我们使用 expect 断言库测试一个数值变量的大小是否符合预期:
const value = 10; const smallValue = 5; const bigValue = 20; expect(value).to.be.a('number'); expect(value).to.be.at.most(bigValue); expect(value).to.be.at.least(smallValue);
其中,我们依次使用 be、at.most 和 at.least 来描述变量 value 的特性,最终的测试结果为通过。
例2:对象和数组的测试
我们使用 expect 断言库测试一个数组,并检验其中元素是否符合预期:
const arr = [1, 2, 3, 4, 5]; expect(arr).to.be.an('array'); expect(arr).to.be.have.lengthOf(5); expect(arr).to.include(3);
通过以上的语句,可以检查数组 arr 是否为数组、长度是否为 5,以及其中是否包含数字 3。这样一来,我们就可以在单元测试中完整地测试一个函数的结果,进而提升代码的可靠性和稳定性。
三、should
should 是除 expect 外,Chai 提供的一种更为神奇的链式语法的断言建构方法。should 在 chai 库中,应用最广泛,目的是帮助我们更加清晰地表达测试预期。
should 的形式非常优美和流畅,它使用以下语法:
value.should.xxx(args...)
通过 should 语句,我们可以以自然语言的方式开展测试,提示我们期望的结果和需要验证的事项。should 的优点在于使其风格更具语言化,更准确地表达了我们的预期。
例3:测试一个基础类型的值
我们使用 should 断言库测试一个数值变量的大小是否符合预期:
const value = 10; value.should.be.a('number').and.is.at.most(20);
以上语句的意思是验证变量 value 是否是一个数值、以及 value 是否小于等于 20,即使得代码更加简洁明了,可读性更强。
例4:测试一个对象
我们使用 should 断言库测试一个对象,检查其属性和方法是否符合预期:
-- -------------------- ---- ------- ----- ---- - ------------------ --------- - ----- - ---------- ------ ---------- - - ----- --- - --- ----------- -------- ------------------------------------------------------- --------------------------------- --------
以上语句的作用是,创建一个对象 obj,并检查其是否包含名为'name'的属性,并且该属性的长度是否为11。所有的 should 语句都能够清晰地表明它的目的。
四、总结
在前端单元测试的过程中,Chai 库是我们必不可少的测试工具之一。而 expect 和 should 这两种断言方法也都各有优缺点,开发人员可以根据需要自行选择。
不管是哪种方法,关键都在于要清楚地定义测试需求,并使用最合适的断言方法进行测试。这样一来,我们就能够保证代码的可靠性和稳定性,进而提升软件开发的效率和质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64990cc848841e9894600b29