如何使用Nock在测试时禁止所有外部API请求?
测试场景下禁止真实外部API请求的实操方案
结合你已经选用的Nock工具,可通过三层防护完全避免漏mock的请求打到线上环境:
- 开启Nock全局网络拦截能力
在所有测试用例执行前的初始化脚本(如Jest的setupFilesAfterEnv配置对应的钩子文件)中添加nock.disableNetConnect()配置,该配置会直接阻断所有未被Nock mock的HTTP/HTTPS请求向外发送,一旦触发未mock的请求会直接抛出异常,从根源上杜绝请求到达线上。
如果你需要放行部分本地/内部测试服务的请求,可以搭配白名单配置使用,比如只允许本地请求通过的写法为nock.enableNetConnect(/(localhost|127\.0\.0\.1)/),只有匹配规则的地址可以正常请求,其他外部地址未mock就会直接报错终止执行。 - 添加mock完整性校验逻辑
给测试框架加全局afterEach钩子,每次单测执行完成后做两个操作:一是调用nock.isDone()校验所有定义的mock是否都被命中,配合nock.pendingMocks()可以快速输出未被命中的mock列表,方便排查漏写mock的场景;二是调用nock.cleanAll()清空当前用例定义的所有mock,避免不同测试用例之间的mock互相干扰。 - 业务层加兜底校验
可以在项目发起外部请求的公共工具层新增判断逻辑:如果当前运行环境为测试环境,先校验请求地址的域名是否在允许的测试白名单内,不在白名单内直接抛出异常,作为Nock拦截之外的第二层防护,即使Nock配置意外失效也不会向外发送真实请求。建议把所有外部API的域名抽成可配置的环境变量,测试环境不要配置线上域名,进一步降低误触风险。
内容的提问来源于stack exchange,提问作者Nathan Arthur
相关产品推荐
相关产品推荐

