Mocha 负责测试结构与执行,Chai 提供可读断言;需安装 mocha、chai(及 chai-as-promised),测试文件置于 test/ 目录,用 describe/it 组织,支持同步、Promise 和 async/await 异步测试。

在 JavaScript 中,用 Mocha 搭配 Chai 编写单元测试是主流做法:Mocha 负责测试结构和执行流程,Chai 提供灵活、可读性强的断言方式。关键在于理清角色分工,并按约定组织代码。
安装与基础配置
先通过 npm 安装核心依赖:
npm install --save-dev mocha chai- 若需测试异步代码(如 Promise),推荐加装
chai-as-promised - 测试文件通常放在
test/目录下,命名如math.test.js
在 package.json 的 scripts 中添加:
"test": "mocha test/**/*.test.js"
编写第一个测试用例
以一个简单加法函数为例:
// src/math.js export const add = (a, b) => a + b;
对应测试文件:
// test/math.test.js
import { expect } from 'chai';
import { add } from '../src/math.js';
describe('add function', () => {
it('should return the sum of two numbers', () => {
expect(add(2, 3)).to.equal(5);
expect(add(-1, 1)).to.equal(0);
});
});
说明:
describe 定义测试套件(逻辑分组)
it 定义单个测试用例(行为描述)
expect(...).to.equal(...) 是 Chai 的 BDD 风格断言,语义清晰易读
常用 Chai 断言模式
Chai 支持多种链式断言,适配不同场景:
- 值相等:
expect(val).to.equal(42)(严格相等,不转换类型) - 深度相等(对象/数组):
expect(obj).to.deep.equal({a: 1}) - 存在性判断:
expect(arr).to.include(3)或expect(str).to.contain('hello') - 异常捕获:
expect(() => fn()).to.throw(/invalid/) - Promise 测试:
return expect(promise).to.eventually.equal('done')
处理异步与生命周期
Mocha 原生支持回调、Promise 和 async/await:
- 返回 Promise:
it('fetches data', () => fetch('/api').then(res => expect(res.ok).to.be.true)) - 使用 async/await(更直观):
it('handles async', async () => { const res = await fetchData(); expect(res).to.exist; }) - 共享状态用
beforeEach/afterEach,例如初始化测试数据或清理 mock
注意:避免混用回调与 async —— Mocha 会因未正确通知完成而超时。


















