1 回答
TA贡献1862条经验 获得超6个赞
您可以为每个测试用例创建一个新服务器。
或者您可以使用通道,特别是通道映射,其中键是测试用例的标识符,例如
getChans := map[string]chan struct{}{}
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
key := strings.Split(r.URL.Path, "/")[1] // extract channel key from path
go func() { getChans[key] <- struct{}{} }()
w.WriteHeader(200)
}))
向测试用例添加通道键字段。这将被添加到主机的 URL 中,然后处理程序将提取密钥,如上所示,以获取正确的频道。还要添加一个字段来指示是否http.Get应该调用:
testCases := []struct {
name string
chkey string
variable string
shouldGet bool
}{
{
name: "test 1",
chkey: "key1"
variable: "foo",
shouldGet: true,
},
// ...
}
在运行测试用例之前,将特定于测试用例的通道添加到地图中:
getChans[tc.chkey] = make(chan struct{})
然后使用测试用例中的通道键字段作为主机 URL 路径的一部分:
err := SomeFeature(server.URL+"/"+tc.chkey, tc.variable)
if err != nil {
t.Error("SomeFeature should not error")
}
并检查是否http.Get被称为使用select一些可接受的超时:
select {
case <-getChans[tc.chkey]:
if !tc.shouldGet {
t.Error(tc.name + " get called")
}
case <-time.Tick(3 * time.Second):
if tc.shouldGet {
t.Error(tc.name + " get not called")
}
}
https://go.dev/play/p/7By3ArkbI_o
- 1 回答
- 0 关注
- 102 浏览
添加回答
举报