介绍
Chai 是一个 JavaScript 测试库,支持三种断言方式:should、expect 和 assert,并且可以与多种测试框架无缝集成,如Mocha、Jasmine、Karma等。本文将围绕 Chai 的三种断言方式,详细介绍 Chai 的 API 和用法,并附带示例代码。
Chai 断言方式
should
should 风格的断言中,一个 Object 会获得一个 should
属性,通过 Object.should
进行链式调用,最终会通过 Object.defineProperty() 方法将 should 置为其中一个断言方法。
// should 风格断言的基本用法 const should = require('chai').should() const num = 10 num.should.be.a('number') num.should.equal(10) num.should.be.above(5)
expect
expect 风格的断言,类似于 should,不过它以一个函数参数的形式传入待测对象。提供更简洁的 API,更直观的语言表达和更好的可读性。
// expect 风格断言的基本用法 const expect = require('chai').expect const num = 10 expect(num).to.be.a('number') expect(num).to.equal(10) expect(num).to.be.above(5)
assert
assert 风格的断言是很多人熟悉的断言方式,接口风格类似于 Node.js 标准库中的 assert 模块。它提供了通用的关键字、判定和诊断的函数。
// assert 风格断言的基本用法 const assert = require('chai').assert const num = 10 assert.typeOf(num, 'number') assert.equal(num, 10) assert.isAbove(num, 5)
Chai 中的方法和属性
断言类型
Chai 提供了丰富的断言类型,可以满足各种测试场景的需要。一些常见的断言类型包括:
equal(val)
: 断言两个值相等,可以进行特定精度的数字比较,也可以深度遍历并判断对象的值是否相等。above(val)
: 断言其值在另一个值之上。ok
: 断言值为真。可以用在测试 true、false 和任何验证后期结果的上下文中。include(val)
: 断言一个会包含在字符串、数组中的值。match(regexp)
: 断言一个字符串可以匹配一个正则表达式。empty
: 断言一个数组、字符串等为空的。exist
: 断言一个给定值存在,也可以搭配一个 msg 断言消息的信息。instanceof
: 断言一个给定值是否是指定构造函数的实例。property(name)
: 断言一个对象是否拥有指定属性,也可以根据路径(如 obj.foo.bar)检查嵌套属性。
// javascriptcn.com 代码示例 // 断言类型的基本用法 const expect = require('chai').expect let person = { name: 'Bob', age: 20, address: { city: 'Beijing', street: 'Nanjing West Road' } } person.should.have.property('name') person.should.have.property('age').that.is.a('number') person.should.have.property('address').that.is.an('object').that.has.property('city') expect(person).to.have.property('address').that.has.property('street').equal('Nanjing West Road') expect([1, 2, 3]).to.include(2) expect('hello world').to.match(/^hello/) expect({name: 'Bob'}).to.deep.equal({name: 'Bob'}) expect(null).to.be.null expect(undefined).to.not.exist expect(person).to.be.an('object').that.instanceof(Object)
Hooks
Chai 还提供了许多 Hooks,用以扩展和自定义 Chai 的行为和功能。包括:
before
: 在当前作用域的所有测验前执行after
: 在当前作用域的所有测验后执行beforeEach
: 在当前作用域的每个测试前执行afterEach
: 在当前作用域的每个测试后执行
// javascriptcn.com 代码示例 // Hooks 的基本用法 const expect = require('chai').expect describe('hooks demo', function () { before(() => console.log('before all tests')) after(() => console.log('after all tests')) beforeEach(() => console.log('before each test')) afterEach(() => console.log('after each test')) it('test 1', () => expect(1 + 1).to.equal(2)) it('test 2', () => expect(2 + 2).to.equal(4)) })
指导意义
Chai 拥有强大的 API,让编写前端测试更加方便,使得通过测试来保证代码质量成为可能。这也是非常好的编程实践。同时,我们还可以通过给 Chai 增加扩展来提高其可用性和可维护性,为我们的团队和项目做出更好的贡献。
总结
本文介绍了 Chai 的三种断言方式,及其实际应用中的 API 和示例代码。掌握 Chai 断言 API 的基本使用,对于进行前端测试和提高测试质量是非常有帮助的。同时也建议大家不断深入学习并了解扩展 Chai 的方法,从而更好地保证代码质量和项目的可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654322887d4982a6ebcca488