gpt4 book ai didi

go - 您如何测试在Go中调用另一个API端点的服务?

转载 作者:行者123 更新时间:2023-12-01 20:26:25 26 4
gpt4 key购买 nike

我有一个使用无限循环创建的简单服务,该服务周期性地调用某个HTTP API,并在aservice包中实现。我在那里创建了一个Service结构。通常,要运行该服务,我会公开一个StartService方法,该方法用于同步运行该服务。软件包的用户可以使用goroutine运行它。我的问题是,您如何编写针对这种情况的测试?

您是否运行整个系统并“模拟” API?我听说使用第三者服务的代码不需要进行测试,但是整个aservice包可能只包含StartServiceShutdown方法。它们的其余部分是未导出的功能/方法,因此无法单独测试。如果是这种情况,那么我根本无法编写任何测试?

最佳答案

使用Go,您将在模拟外部http请求时获得很棒的体验。长话短说,只是用net/http/httptest包中的服务器URL替换基本URL。
您可以模仿Google模拟外部请求的方式,例如在google map here中探索测试。

server := mockServer(200, response)
defer server.Close()
c, _ := NewClient(WithAPIKey(apiKey), WithBaseURL(server.URL))
r := &DirectionsRequest{
Origin: "Google Sydney",
Destination: "Glebe Pt Rd, Glebe",
Mode: TravelModeTransit,
}

resp, _, err := c.Directions(context.Background(), r)
// your assertions goes here


// Create a mock HTTP Server that will return a response with HTTP code and body.
func mockServer(code int, body string) *httptest.Server {
server := mockServerForQuery("", code, body)
return server.s
}

func mockServerForQuery(query string, code int, body string) *countingServer {
server := &countingServer{}

server.s = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if query != "" && r.URL.RawQuery != query {
dmp := diffmatchpatch.New()
diffs := dmp.DiffMain(query, r.URL.RawQuery, false)
log.Printf("Query != Expected Query: %s", dmp.DiffPrettyText(diffs))
server.failed = append(server.failed, r.URL.RawQuery)
http.Error(w, "fail", 999)
return
}
server.successful++

w.WriteHeader(code)
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
fmt.Fprintln(w, body)
}))

return server
}

关于go - 您如何测试在Go中调用另一个API端点的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61936944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com