Chai 中文文档 下载 App

expect vs should vs assert 三种断言风格全面对比与选择建议

一句话结论

六维度对比表

维度expectshouldassert
初始化无,直接 require('chai').expect必须 chai.should()无,直接 require('chai').assert
原型污染无扩展 Object.prototype无
null/undefined原生支持报错,需助手/expect 混用原生支持
IE9 兼容✅❌✅
链式调用✅ 完整链式✅ 完整链式❌ 无链式
自然语言感好最好一般(函数调用)
ES2015 模块import { expect } from 'chai'import 'chai/register-should'import { assert } from 'chai'
深度相等.deep 修饰链.deep 修饰链assert.deepEqual() 独立方法
自定义消息expect(val, '消息') 首参第二位置不支持(需用 expect)assert.xxx(a, b, '消息') 末参
插件兼容全部全部全部

功能等价性

底层完全等价——三种风格共享同一套断言实现。下表展示同一个意图的三种写法:

// 意图:验证对象 {a:1} 和预期值深度相等
const actual = { a: 1 };
const expected = { a: 1 };

// expect
expect(actual).to.deep.equal(expected);

// should
actual.should.deep.equal(expected);

// assert
assert.deepEqual(actual, expected);

链式修饰器在 expect 和 should 中都能使用,assert 风格则通过独立方法体现(assert.deepEqual 而非 assert.equal 加修饰器)。

expect 风格优缺点

优势:

劣势:

should 风格优缺点

优势:

劣势:

assert 风格优缺点

优势:

劣势:

团队内统一风格

一个团队内选一种风格并保持一致,不要混用。

常见做法:

// .mocharc.js - 全局注册 should
module.exports = {
  require: ['chai/register-should']
};

何时考虑切换风格

结论

大多数项目,expect 是最安全的选择。它没有明显短板,所有场景都能处理好,且是官方推荐。should 虽然读起来很顺,但原型注入和 null 处理让它有一些绕不开的痛点。assert 主要面向特定迁移场景。

下一步