Chai 中文文档 下载 App

Chai 热门插件推荐 - chai-as-promised chai-http chai-subset chai-string 等

插件目录在哪里

Chai 官方维护了一个插件目录,社区贡献超过 200 个插件。这里精选常用的、活跃维护的。

按场景分类

异步场景

插件用途热度
chai-as-promisedPromise 断言:.eventually、.rejectedWith⭐⭐⭐⭐⭐
chai-promisedchai-as-promised 的活跃 fork(v7+ 原生 ESM)⭐⭐⭐⭐
chai-async-bddBDD 风格异步断言⭐⭐

首选 chai-as-promised——生态最成熟、文档最全、社区最常用。

HTTP / API 测试

插件用途平台
chai-httpExpress/Koa 应用集成测试Node.js
chai-superagentchai-http 的浏览器兼容变体Node + 浏览器
chai-request类似 chai-http,基于 requestNode.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-domjsdom / 浏览器环境 DOM 断言
chai-webdriverSelenium webdriver 集成测试
chai-jqueryjQuery DOM 断言(.have.class / .visible / .hidden)
enzymeReact 组件测试的断言扩展
chai-jest-snapshotChai 风格的 Jest 快照测试

如果用 Vitest + jsdom,直接用 Vitest 自带的 DOM 匹配器(不依赖 Chai)更简洁。

JSON 验证

插件用途
chai-json-schema用 JSON Schema 验证对象结构
chai-json-pattern简化版 JSON 模式匹配

数据类型增强

插件用途
chai-bignumberbignumber.js / decimal.js 精度数值断言
chai-date日期专用断言
chai-immutableImmutable.js 结构断言
chai-sinonSinon spy/stub/mock 断言的 Chai 风格集成

测试辅助

插件用途
chai-momentmoment.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]);

插件生态维护状态

插件生态是社区驱动的,质量和维护状态参差不齐:

安装前先查两件事: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):

前端组件测试(Vitest):

通用异步测试:

下一步