以下是基于 Mocha 框架并结合 Node.js 内置的 assert
模块实现的 Pact 契约测试示例(不使用 Chai):
1. 消费者端测试(User Service)
完全使用 assert
替代 Chai 的 expect
:
1 | // tests/consumer/orderApiConsumer.spec.js |
2. 提供者端测试(Order Service)
同样替换为 assert
:
1 | // tests/provider/orderApiProvider.spec.js |
3. 关键改动说明
1. 断言语法替换
对象深度比较:
1
2
3
4
5// Chai
expect(response).to.deep.equal(expectedResponse);
// assert
assert.deepStrictEqual(response, expectedResponse);布尔值验证:
1
2
3
4
5// Chai
expect(result).to.include("Pact Verification Complete");
// assert
assert.ok(result.includes("Pact Verification Complete"));
2. 模块引入
- 删除
chai
依赖,直接使用 Node.js 内置的assert
模块:1
const assert = require("assert");
4. 运行测试
1. 调整依赖
无需安装 chai
,只需安装 mocha
和 pact
:
1 | npm install mocha @pact-foundation/pact --save-dev |
2. 执行命令
与之前相同:
1 | # 消费者端生成契约 |
5. 两种方式的对比
场景 | Chai (expect) | Node.js assert |
---|---|---|
语法简洁性 | 链式语法更直观(如 .to.deep.equal() ) |
函数式调用(如 assert.deepStrictEqual() ) |
依赖管理 | 需额外安装 chai |
无额外依赖 |
错误信息可读性 | 错误信息更详细(如差异对比) | 错误信息较简单(仅提示断言失败) |
适合场景 | 需要丰富断言语义和复杂验证逻辑 | 追求轻量化和最小依赖 |
总结
完全可以使用 Node.js 内置的 assert
替代 Chai,代码改动成本极低,但需注意:
- 断言方法差异:例如深度比较需使用
assert.deepStrictEqual
。 - 错误信息简化:
assert
的错误提示不如 Chai 详细,但可通过自定义错误消息补充:1
assert.deepStrictEqual(a, b, "响应数据与预期不符");
- 轻量化优势:减少依赖项,适合对项目简洁性要求高的场景。