Chai.js 断言库是什么 - JavaScript BDD/TDD 测试断言简介
一句话定位
Chai 是一个为 Node.js 和浏览器设计的 BDD / TDD 断言库。它的职责很单一——在测试用例里验证「实际值」和「期望值」是否匹配,不匹配就抛出明确的 AssertionError。
为什么需要 Chai
原生 JavaScript 没有内置的断言机制(Node.js 有 assert 模块,但功能有限且不是所有环境都有)。你当然可以写 if (actual !== expected) throw new Error(...) 来手动断言,但这样写既啰嗦、错误提示也不友好。
Chai 解决的核心问题:
- 可读性:链式语言
expect(foo).to.be.a('string')比typeof foo === 'string'更接近自然语言。 - 错误信息:失败时自动生成类似
AssertionError: expected 43 to equal 42的可读消息。 - 功能丰富:深度相等、正则匹配、属性链访问、集合比较等原生不支持的断言开箱即用。
- 风格自由:三种风格任选,不会被某一种测试框架绑定。
- 插件驱动:社区生态提供了 Promise、HTTP、DOM 等场景的扩展插件。
Chai 不是什么
- 不是测试运行器——它不负责发现测试文件、调度测试用例、生成报告,这些工作交给 Mocha、Jest、Vitest 等。
- 不是 Mock 框架——stub、spy、fake 这些交给 Sinon.js、nock 等。
- 不是覆盖率工具——istanbul / nyc、c8 等负责统计。
Chai 只做一件事:断言。
三种风格一瞥
Chai 提供三种断言接口,底层共享同一套实现:
expect 风格(BDD 链式,推荐新手)
var expect = require('chai').expect;
expect('hello').to.be.a('string');
expect([1, 2, 3]).to.have.lengthOf(3);
expect({ name: 'Chai' }).to.have.property('name').equal('Chai');
should 风格(BDD 链式,需要初始化)
var should = require('chai').should();
'hello'.should.be.a('string');
[1, 2, 3].should.have.lengthOf(3);
({ name: 'Chai' }).should.have.property('name');
assert 风格(TDD 经典,类 Node 内置 assert)
var assert = require('chai').assert;
assert.typeOf('hello', 'string');
assert.lengthOf([1, 2, 3], 3);
assert.property({ name: 'Chai' }, 'name');
三种风格的功能覆盖是等价的,选哪个取决于团队习惯和个人偏好。后续章节会详细对比。
生态位置
在 JavaScript 测试栈中,Chai 占据的位置大致如下:
测试运行器(Mocha / Jest / Vitest)
└── 断言库(Chai / Jest expect)
└── 插件(chai-as-promised / chai-http / sinon-chai ...)
└── Mock(Sinon / nock)
└── 覆盖率(nyc / c8)
如果你用 Jest,它自带 expect 断言库;如果你用 Mocha、Vitest 或其他运行器,通常会搭配 Chai。这也是 Chai 最常见的使用场景。
与本手册的关系
本站将围绕「实战参考」展开:Node.js 安装 讲 Node.js 安装;浏览器引入 讲浏览器引入;第一个断言 带你写出第一条断言;搭配 Mocha 演示如何与 Mocha 配合跑完整测试套件。