如何配置PollyJS在Jest集成测试中忽略本地服务器请求并录制外部服务请求
解决PollyJS忽略本地服务器请求、仅录制外部服务请求的配置方案
我之前在做集成测试时也碰到过完全一样的场景,折腾了一会儿才摸清楚PollyJS的正确配置方式。核心就是通过排除本地请求规则+精准匹配外部请求的组合来实现需求,给你详细说下步骤:
核心配置思路
我们需要告诉PollyJS两件事:
- 完全忽略对
127.0.0.1:3000的所有请求,不要拦截或录制它们 - 正常拦截并录制所有发往外部服务(比如
example.com)的请求
具体实现代码
假设你用的是Jest测试框架,搭配@pollyjs/core和@pollyjs/adapter-node-http适配器(因为要拦截Node环境中本地服务器发起的请求),配置示例如下:
import { Polly } from '@pollyjs/core'; import NodeHttpAdapter from '@pollyjs/adapter-node-http'; // 注册Node环境的HTTP适配器 Polly.register(NodeHttpAdapter); describe('集成测试:仅录制外部服务请求', () => { let pollyInstance; beforeEach(() => { pollyInstance = new Polly('外部服务调用录制', { // 指定使用Node HTTP适配器,确保能拦截本地服务器发起的请求 adapters: ['node-http'], // 根据需求设置:true表示录制未存的请求,false表示仅回放已有录制 recordIfMissing: true, // 配置请求匹配规则,确保外部请求能被正确识别 matchRequestsBy: { method: true, url: { protocol: true, hostname: true, pathname: true, query: true } }, // 关键:排除本地服务器的所有请求 excludeUrl: /^http:\/\/127\.0\.0\.1:3000/ }); }); afterEach(async () => { // 停止Polly并保存录制内容(如果开启了录制) await pollyInstance.stop(); }); it('测试本地接口,仅录制外部依赖请求', async () => { // 发起对本地服务器的请求 const localResponse = await fetch('http://127.0.0.1:3000/api/some-path'); const responseData = await localResponse.json(); // 你的断言逻辑 expect(localResponse.ok).toBe(true); expect(responseData).toHaveProperty('expectedField'); }); });
关键配置说明
excludeUrl:这里用正则表达式精准匹配本地服务器的URL前缀,Polly会自动跳过这些请求的拦截和录制。如果你的本地服务器用localhost:3000,记得把正则改成/^http:\/\/localhost:3000/。adapters: ['node-http']:这个非常重要!因为本地服务器是在Node环境中运行的,它发起的外部请求需要Node适配器来拦截,默认的浏览器适配器是管不到服务器端请求的。matchRequestsBy:确保请求匹配规则足够精准,避免误匹配或漏匹配外部请求。上面的配置会匹配请求方法、协议、域名、路径和查询参数,基本能覆盖大部分场景。
常见坑点提示
- 确保Polly的初始化早于本地服务器的启动,这样才能在服务器发起外部请求前就完成拦截配置。
- 如果本地服务器有多个端口或域名,要调整
excludeUrl的正则,比如用/(http:\/\/127\.0\.0\.1:3000|http:\/\/localhost:3000)/来兼容两种地址。 - 检查Polly的录制存储目录(默认是
__recordings__),确认只有外部服务的请求被录制下来,本地请求不会出现在录制文件中。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

