chai.js 断言库使用说明 (Expect 风格写法)

简介

Chai.js 是一个非常流行的 JavaScript 断言库,主要用于配合如 Mocha, Jest 等测试框架编写用户端或服务端的 JavaScript 测试。它提供了 BDD(Behavior-Driven Development,行为驱动开发) 和 TDD(Test-Driven Development,测试驱动开发)两种样式的断言,即 expectshould, assert 三种。

expectshould 属于 BDD 风格,他们都是链式语法,所不同的是 expect 是直接调用,而 should 则是添加在任何 JavaScript 对象上,他们的使用场景都是 BDD。

1
expect(true).to.be.true;
1
true.should.be.true;

assert 是 TDD 风格,它看起来更像一个函数。

1
assert(true, "True is true");

Chai 的主要优点是其易于使用和灵活性。它支持插件,并且对多种环境有良好的兼容性,包括 Node.js, 浏览器, 和各种 JavaScript 构建工具(如 Browserify, Webpack)。

通过使用不同类型的断言,你可以选择适合你测试风格的类型。对于更复杂的用例,Chai 提供了友好的错误消息,帮助你快速理解测试失败的原因。

Expect 风格写法

以下指南介绍了如何使用 Expect 风格编写各种类型的断言。

引入 Expect

在测试文件头部,使用 ES6 模块导入语法引入 Chai 库的 Expect 风格:

1
import { expect } from "chai";

等于

检查两个值是否相等:

1
2
3
expect("hello").to.equal("hello");
expect(42).to.equal(42);
expect(1).to.not.equal(true);

深度相等

如果你要检查两个对象或数组的值是否相同:

1
2
expect({ foo: "bar" }).to.deep.equal({ foo: "bar" });
expect([1, 2, 3]).to.deep.equal([1, 2, 3]);

包含

例子:检查数组是否包含某个元素或字符串包含一段字串:

1
2
expect([1, 2, 3]).to.include(2);
expect("foobar").to.contain("foo");

大于、大于等于、小于、小于等于

1
2
3
4
expect(10).to.be.above(5);
expect(10).to.be.at.least(10);
expect(10).to.be.below(20);
expect(10).to.be.at.most(20);

判断属性是否存在

检查对象中是否存在某个属性:

1
expect({ a: 1 }).to.have.property("a");

包含键

假设你要检查一个对象是否包含一个或者多个键:

1
2
expect({ a: 1, b: 2, c: 3 }).to.include.keys("a", "b");
expect({ x: 1, y: 2, z: 3 }).to.not.include.keys("p", "q");

类型

检查值的类型:

1
2
3
4
expect("test").to.be.a("string");
expect({ foo: "bar" }).to.be.an("object");
expect(null).to.be.a("null");
expect(undefined).to.be.a("undefined");

不为空

检查一个值是否为空

1
2
expect("Hello").to.not.be.empty;
expect([]).to.be.empty;

类型和类型的属性

希望类型是某个特定的结构的时候可以用propertyaan联合使用。

1
2
3
4
expect({ tea: { temperature: "hot", name: "chai" } })
.to.have.property("tea")
.which.has.a.property("temperature")
.that.is.a("string");

用’.throw’测试可能出错的函数

假设你测试一个可能抛出错误的函数,你可以使用 throw 结构:

1
2
3
4
5
6
7
8
let badFn = function () {
throw new TypeError("Illegal salmon!");
};
expect(badFn).to.throw();
expect(badFn).to.throw("salmon");
expect(badFn).to.throw(/salmon/);
expect(badFn).to.throw(TypeError);
expect(badFn).to.throw(TypeError, "salmon");

其他

这只是 Chai.js Expect 风格断言更多的用法教程,详细信息请参考 Chai.js Expect API 文档

参考

chai.js 断言库使用说明 (Expect 风格写法)

https://blog.dadilive.top/20241025/d7fe4f68.html

发布于

2024-10-25

更新于

2025-07-07

许可协议

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×