使用httptest mock API时如何校验请求是否符合预期?
实现思路
核心逻辑是在mock服务的handler中记录收到的请求信息,待被测函数执行完成后校验记录值即可:
- 在测试函数内声明变量,用于存储收到的请求路径
- 在mock服务的handler闭包中,将收到的请求路径赋值给外部声明的变量
- 调用完被测函数后,先判断变量是否为空确认是否收到请求,再判断路径是否符合预期
完整示例代码
func TestSomeFeature(t *testing.T) { // 存储实际收到的请求路径 var receivedPath string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 记录请求路径 receivedPath = r.URL.Path w.WriteHeader(http.StatusOK) })) // 测试结束后关闭mock服务,避免端口占用 defer server.Close() // 调用待测试的业务函数 SomeFeature(server.URL, "foo") // 断言:必须收到请求 if receivedPath == "" { t.Fatal("未收到任何请求,被测函数未正确发起调用") } // 断言:请求路径必须符合预期 if receivedPath != "/foo" { t.Fatalf("请求路径不匹配,预期:/foo,实际:%s", receivedPath) } }
扩展说明
- 如果需要校验请求方法、请求头、请求体等更多信息,只需要在handler中将对应信息存入外部变量,后续增加对应的校验逻辑即可
- 如果测试场景涉及多次请求,可以用切片
[]string存储所有收到的请求路径,先校验切片长度确认请求次数,再逐一校验路径内容 - 如果你使用第三方测试断言库(比如testify/assert),可以简化断言写法,比如直接用
assert.Equal(t, "/foo", receivedPath, "请求路径错误")
内容的提问来源于stack exchange,提问作者Timo Huovinen
相关产品推荐
相关产品推荐

