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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何测试一个在Go中调用另一个API端点的服务?相关的知识,希望对你有一定的参考价值。

我有一个使用无限循环创建的简单服务,定期调用某个HTTP API,在一个包中实现了 aservice. 我创建了一个 Service 结构。通常情况下,为了运行该服务,我暴露了一个叫做 StartService 方法,用于同步运行该服务。包的用户就可以使用goroutine来运行它。我的问题是,你如何编写这种情况下的测试?

你是否要运行整个系统并 "模拟 "API?我听说,使用第三方服务的代码不需要测试,但整个的 aservice 包装中只能包含 StartServiceShutdown 方法,其余的是未导出的函数方法。其余的都是未导出的函数方法,那么就不能单独进行测试。如果是这样的话,那么我根本就不能写任何测试了?

答案

有了Go,你在模拟外部http请求的时候会有很棒的体验。长话短说,只需用nethttphttptest包中的服务器url替换base url.你可以模仿Google模拟外部请求的方式,例如在google地图中探索测试。此处.

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中调用另一个API端点的服务?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 API 端点动态触发现有 Flux - Spring Webflux

go中一次处理许多GET请求

在 go 中一次处理多个 GET 请求

在哪里可以找到正确的 HTTP 端点以在 Oauth2 Playground 中测试 Google Ads API 调用?

调用 Web API 2 端点时出现 HTTP 415 不支持的媒体类型错误

Apache config api端点