Pactum测试Mock外部API报Interaction not exercised的本地解决方法
报错核心原因
Interaction not exercised本质是你定义的Mock规则从未被请求命中,两个直接诱因:
- Pactum本地Mock的交互匹配规则不支持在
path字段填完整URL,你写的完整公网地址属于无效配置,不会被匹配逻辑识别。 - 业务代码默认还是向公网的mockapi.io地址发请求,完全没把请求发到Pactum启动的本地Mock服务上,自然命中不了规则。
本地Mock落地步骤
- 第一步:固定Pactum Mock服务端口,在测试全局生命周期启动/关闭服务
不要用默认随机端口,固定端口后方便业务代码把外部请求指向本地Mock,示例代码(以Mocha/Jest钩子为例):const { mock, spec } = require('pactum'); before(async () => { await mock.start(3001); // 固定监听本地3001端口 }); after(async () => { await mock.stop(); // 测试全部跑完关闭Mock服务 }); - 第二步:改造业务代码的外部API地址配置,支持环境切换
不要把外部API的基地址https://62b32eab4f851f87f4563d9b.mockapi.io硬编码在业务逻辑里,通过环境变量做适配,测试环境下把基地址指向本地Mock服务:
运行测试时注入环境变量// 业务代码中外部API基地址配置 const EXTERNAL_API_BASE = process.env.EXTERNAL_API_BASE || 'https://62b32eab4f851f87f4563d9b.mockapi.io'; // 实际调用外部API的逻辑 const externalUserRes = await fetch(`${EXTERNAL_API_BASE}/user/${userId}`);EXTERNAL_API_BASE=http://localhost:3001,所有业务侧发起的外部API请求就会全部打到本地Mock服务上。 - 第三步:修正交互规则的配置格式
Pactum交互规则的path字段只需要填写接口路径部分,不需要带域名协议,修正后的测试用例:it('should update record', async () => { await spec() .post('http://localhost:3000/user') .withJson({ "name": "helen", "city": "London" }) .useInteraction({ request: { method: 'GET', path: '/user/32' // 仅填写路径部分即可 }, response: { status: 200, body: [ {"name":"Jerald Labadie","country":"Buckinghamshire","city":"Lake Junebury","email":"Alf_Schneider81@gmail.com","id":"32"} ] } }) .expectStatus(200) })
优化提示
- 如果路径里的用户ID是动态生成的,不要写死
/user/32,可以用通配符/user/*、路径参数规则或者正则做匹配,避免动态值导致匹配失败。 - 不需要手动加
.wait(3000)做硬等待,Pactum默认会等待所有声明的交互被调用完成后再执行断言,硬等待只会拖慢测试执行速度。 - 如果本地开了系统代理,记得把
localhost加入代理绕过列表,避免请求被代理转发到公网,打不到本地Mock端口。
内容的提问来源于stack exchange,提问作者kzaiwo
相关产品推荐
相关产品推荐

