Chai 热门插件推荐 - chai-as-promised chai-http chai-subset chai-string 等
插件目录在哪里
Chai 官方维护了一个插件目录,社区贡献超过 200 个插件。这里精选常用的、活跃维护的。
按场景分类
异步场景
| 插件 | 用途 | 热度 |
|---|---|---|
| chai-as-promised | Promise 断言:.eventually、.rejectedWith | ⭐⭐⭐⭐⭐ |
| chai-promised | chai-as-promised 的活跃 fork(v7+ 原生 ESM) | ⭐⭐⭐⭐ |
| chai-async-bdd | BDD 风格异步断言 | ⭐⭐ |
首选 chai-as-promised——生态最成熟、文档最全、社区最常用。
HTTP / API 测试
| 插件 | 用途 | 平台 |
|---|---|---|
| chai-http | Express/Koa 应用集成测试 | Node.js |
| chai-superagent | chai-http 的浏览器兼容变体 | Node + 浏览器 |
| chai-request | 类似 chai-http,基于 request | Node.js |
首选 chai-http——官方推荐、Express 自动服务器管理最方便。
对象 / 集合增强
| 插件 | 用途 |
|---|---|
| chai-subset | 验证对象/数组是否包含给定子集(.to.containSubset(...)) |
| chai-deep-match | 深度匹配,支持 partial match |
| chai-exclude | .excluding(['a','c']).to.deep.equal(...) 排除某些键再比较 |
| chai-equal-ignore-undefined | 深度相等时忽略 undefined 值 |
| chai-optional | .with.optional('extraKey') 让部分键可选 |
| chai-match-snapshot | 快照测试(类似 Jest snapshot) |
首选 chai-subset——验证 API 返回对象部分结构特别方便。
字符串增强
| 插件 | 用途 |
|---|---|
| chai-string | .startWith() / .endWith() / .includeSpace() / .lengthOfOneOf() |
| chai-regex | 更多正则相关断言 |
首选 chai-string——补齐核心没有的前缀/后缀断言。
DOM / 浏览器端测试
| 插件 | 用途 |
|---|---|
| chai-dom | jsdom / 浏览器环境 DOM 断言 |
| chai-webdriver | Selenium webdriver 集成测试 |
| chai-jquery | jQuery DOM 断言(.have.class / .visible / .hidden) |
| enzyme | React 组件测试的断言扩展 |
| chai-jest-snapshot | Chai 风格的 Jest 快照测试 |
如果用 Vitest + jsdom,直接用 Vitest 自带的 DOM 匹配器(不依赖 Chai)更简洁。
JSON 验证
| 插件 | 用途 |
|---|---|
| chai-json-schema | 用 JSON Schema 验证对象结构 |
| chai-json-pattern | 简化版 JSON 模式匹配 |
数据类型增强
| 插件 | 用途 |
|---|---|
| chai-bignumber | bignumber.js / decimal.js 精度数值断言 |
| chai-date | 日期专用断言 |
| chai-immutable | Immutable.js 结构断言 |
| chai-sinon | Sinon spy/stub/mock 断言的 Chai 风格集成 |
测试辅助
| 插件 | 用途 |
|---|---|
| chai-moment | moment.js 日期断言 |
| chai-fuzzy | 模糊匹配 / 容忍小差异 |
| chai-like | .like({...}) 宽松匹配 |
安装与注册
import chai from 'chai';
import chaiAsPromised from 'chai-as-promised';
import chaiHttp from 'chai-http';
import chaiSubset from 'chai-subset';
import chaiString from 'chai-string';
// 注册顺序:先 chai-as-promised,其他无要求
chai.use(chaiAsPromised);
chai.use(chaiHttp);
chai.use(chaiSubset);
chai.use(chaiString);
组合使用示例
chai-as-promised + chai-http
import chaiAsPromised from 'chai-as-promised';
import chaiHttp from 'chai-http';
chai.use(chaiAsPromised);
chai.use(chaiHttp);
const expect = chai.expect;
const app = express();
it('完整异步测试', async function () {
// chai-http 发请求,返回 Promise
const res = await chai.request(app).get('/users');
expect(res).to.have.status(200);
expect(res.body.data).to.eventually.be.an('array'); // chai-as-promised
});
chai-subset 验证 API 返回结构
import chaiSubset from 'chai-subset';
chai.use(chaiSubset);
// API 返回了很多字段,只关心关键字段
expect(apiResponse).to.containSubset({
status: 'success',
data: [
{ id: expect.any(Number), name: expect.any(String) }
]
});
chai-string 前缀 / 后缀
import chaiString from 'chai-string';
chai.use(chaiString);
expect('hello world').to.startWith('hello');
expect('hello world').to.endWith('world');
expect('hello world').to.have.lengthOfOneOf([10, 11]);
插件生态维护状态
插件生态是社区驱动的,质量和维护状态参差不齐:
- 活跃维护:chai-as-promised、chai-http、chai-subset、chai-string、chai-dom
- 维护放缓:chai-webdriver、chai-superagent(功能稳定,但依赖更新不频繁)
- 可能过时:带
jquery字样的插件(jQuery 使用量下降)
安装前先查两件事:npm 上的 weekly downloads 数量 + GitHub 上最近一次 commit 是什么时候。
何时不用插件
有些场景用内置断言或自定义 helper 就够了:
// ❌ 为了 .startWith 而装 chai-string
expect(url).to.startWith('https://');
// ✅ 不用插件,一行正则搞定
expect(url).to.match(/^https?:\/\//);
装插件意味着多一个依赖、多一次 chai.use() 调用。如果只用到一个小功能,用内置断言 + .satisfy + 正则通常更轻量。
推荐的插件组合
Node.js API 测试(Express/Koa):
- chai + chai-http + chai-as-promised
- 可选:chai-subset、chai-exclude
前端组件测试(Vitest):
- 直接用 Vitest 自带的
expect(基于 jest-expect)+ @testing-library - 如果一定要用 Chai:chai + chai-dom
通用异步测试:
- chai + chai-as-promised
下一步
- 插件机制详解 → 插件基础
- 写自定义插件 → 插件基础页 插件基础
- chai-http 实战 → chai-http 插件