根本原因是Pact Mock Server未启动,go-pact仅是客户端SDK,默认连接localhost:1234但无服务监听;需手动安装pact-cli并运行pact-mock-service,Go测试中显式配置Host/Port,且HTTP请求必须经Mock Server、交互注册须在调用前、每个测试需独立实例并调用Teardown。

go-pact 启动就报 connection refused 是什么问题
根本不是代码写错了,而是 Pact Mock Server 没起来。go-pact 只是客户端 SDK,不带服务进程,它默认连 http://localhost:1234,但这个端口没人监听。
必须手动启动 Pact Mock Server:
- 先装 CLI:
npm install -g pact-cli - 再启服务:
pact-mock-service --port 1234 --host localhost - Go 测试里别依赖默认配置,显式传参:
NewPact(PactConfig{Host: "localhost", Port: 1234}) - CI 环境(比如 Linux Docker)要提前在镜像里装好
pact-cli,否则command not found
消费者测试里 HTTP 请求没被记录,interaction 为空
因为请求根本没发到 Pact Mock Server。常见错误是 client 初始化写死真实域名,比如 NewClient("https://api.example.com"),结果请求飞走了,mock 完全没感知。
测试中必须用 pact.MockServiceURL() 动态构造 client:
立即学习“go语言免费学习笔记(深入)”;
client := NewClient(pact.MockServiceURL())-
AddInteraction()必须在 HTTP 调用前执行,顺序错则 interaction 不生效 - 每个测试用例末尾必须调
pact.Teardown(),否则 pact 文件可能写一半或为空 - 并发测试(
t.Parallel())时,每个测试需独立pact实例,否则 interaction 互相覆盖
VerifyProvider 总报 no interactions found
不是 pact 文件没生成,而是路径、命名或匹配逻辑对不上。Provider 验证是“按名索引 + 按路径匹配”,错一个字符就失败。
关键点:
-
PactURLs必须显式指定完整路径,如./pacts/order-service-inventory-service.json,不能只写目录 - 文件名必须严格为
{consumer-name}-{provider-name}.json,大小写、连字符都不能差 -
consumer.name和provider.name字段值,必须和验证时传入的ProviderName/ConsumerName完全一致 - Provider 接口实际响应的
status、Content-Type、JSON 字段名大小写,必须和 pact 文件里声明的一模一样
WithRequest 和 WithResponse 哪些字段不能省
省略 Method、Path、Status 中任意一个,验证阶段会静默跳过匹配,报错信息只显示 mismatched headers 或 no interactions matched,非常难定位。
实操建议:
- 必须显式声明
Method、Path、Status—— 它们是匹配基准,缺一不可 - Query 参数要展开写进
Query字段,别拼字符串塞进Path - 如果契约里定义了
Content-Type: application/json,但 handler 实际返回text/plain,验证直接失败,且错误提示极不直观
最易被忽略的是:Provider 端路由前缀(比如 /api/v1)没对齐 pact 文件里的 path,Verifier 默认按绝对路径匹配,不会自动补 base path。


















