Chai.js 是一款常用的 JavaScript 断言库,它提供了多种不同风格的断言接口,包括 assert、expect 和 should 等。在其中,assert 和 expect 是最常用和最基础的两个接口,但是它们又有一些区别。在本文中,我们将详细介绍 Chai.js 中的 assert 和 expect 的区别,并提供示例代码和实用指导。
assert
assert 接口是 Chai.js 中最基础的断言接口,其语法为 assert(expression, message)
。其中,expression 表示需要断言的表达式,当其为真时,断言通过;否则断言不通过,将抛出异常,需要使用 try-catch 来捕获异常。message 参数为可选项,用于在断言失败时打印自定义信息。
assert 接口的使用通常分为两种场景。第一种是在测试框架中使用,例如在 Mocha 中:
-- -------------------- ---- ------- ----- ------ - ----------------------- ----------------- ---------- - ---------------------- ---------- - ---------- ------ -- ---- --- ----- -- --- --------- ---------- - -------------------------------- ---- --- --- ---
在上述示例中,使用 assert.equal 表达式来断言 [1,2,3].indexOf(4)
的值为 -1,当其为真时,测试通过。
第二种场景是在编程中使用,例如:
const assert = require('chai').assert; function add(a, b) { return a + b; } assert.equal(add(2, 3), 5, '2 + 3 = 5');
在上述示例中,使用 assert.equal 表达式来断言 add(2, 3)
的值为 5,当其为真时,断言通过。如果 add(2, 3)
的值为其他值,例如 4,断言不通过,将抛出异常,异常信息为 '2 + 3 = 5'。
总体来说,assert 接口使用简单明了,但是需要手动捕获异常,当表达式复杂时容易出现错误。
expect
expect 接口是一个更加强大和灵活的断言接口,其语法为 expect(expression).method2(args2).method3(args3)
。其中,expression 表示需要断言的表达式,而 method1、method2、method3 表示需要对 expression 进行的链式操作,例如 to.be.equal,to.be.a 等。这些方法可以使用自然语言方法链接,创造出一个更易读和可读性更好的断言。
expect 接口的使用通常分为两种场景。第一种是链式操作,例如:
const expect = require('chai').expect; expect([1, 2, 3]).to.have.lengthOf(3); expect('foo').to.be.a('string'); expect(null).to.be.null; expect(undefined).to.not.exist; expect({ a: 1 }).to.have.property('a');
在上述示例中,使用 expect 接口分别对一个数组、一个字符串、一个 null、一个 undefined 和一个对象进行了链式操作,断言它们的长度、类型、存在和属性等特征。
第二种场景是在编程中使用,例如:
const expect = require('chai').expect; function add(a, b) { return a + b; } expect(add(2, 3)).to.equal(5);
在上述示例中,使用 expect 接口对 add(2, 3)
的值进行断言,如果其等于 5,则断言通过,否则断言不通过。
总体来说,expect 接口使用更加方便,链式操作可以提高可读性,但是需要注意方法名和调用顺序,以及链式操作的结束。
总结
assert 和 expect 接口是 Chai.js 中最基础和最常用的两个断言接口,它们有一些区别。assert 接口使用简单,但需要手动捕获异常,而 expect 接口则更加灵活,使用链式操作可以提高可读性。在使用时,我们可以根据场景和需求选择合适的接口。
除此之外,Chai.js 还有 should 接口和 BDD(behavior-driven development)和 TDD(test-driven development)风格的 expect 和 assert 接口。这些接口都可以根据实际需求进行选择和使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645a351f968c7c53b0c57897