Chai 中文文档 下载 App

Chai.js 断言库是什么 - JavaScript BDD/TDD 测试断言简介

一句话定位

Chai 是一个为 Node.js 和浏览器设计的 BDD / TDD 断言库。它的职责很单一——在测试用例里验证「实际值」和「期望值」是否匹配,不匹配就抛出明确的 AssertionError。

为什么需要 Chai

原生 JavaScript 没有内置的断言机制(Node.js 有 assert 模块,但功能有限且不是所有环境都有)。你当然可以写 if (actual !== expected) throw new Error(...) 来手动断言,但这样写既啰嗦、错误提示也不友好。

Chai 解决的核心问题:

  1. 可读性:链式语言 expect(foo).to.be.a('string') 比 typeof foo === 'string' 更接近自然语言。
  2. 错误信息:失败时自动生成类似 AssertionError: expected 43 to equal 42 的可读消息。
  3. 功能丰富:深度相等、正则匹配、属性链访问、集合比较等原生不支持的断言开箱即用。
  4. 风格自由:三种风格任选,不会被某一种测试框架绑定。
  5. 插件驱动:社区生态提供了 Promise、HTTP、DOM 等场景的扩展插件。

Chai 不是什么

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 配合跑完整测试套件。