为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白猪掌柜的 2022-06-06 14:55:54
我有一个使用无限循环创建的简单服务,以定期调用某个 HTTP API,在 package 中实现aservice。我在Service那里创建了一个结构。通常,为了运行该服务,我公开了一个StartService用于同步运行该服务的方法。然后,包的用户可以使用 goroutine 运行它。我的问题是,你如何为这种场景编写测试?您是否运行整个系统并“模拟”API?我听说使用 3rd 方服务的代码不需要测试,但整个aservice包可能只包含StartService和Shutdown方法。其余的是未导出的函数/方法,因此无法单独测试。如果是这样的话,那么我根本就不能写任何测试吗?
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

使用 Go,您将在模拟外部 http 请求时获得很棒的体验。长话短说,只需用 net/http/httptest 包中的服务器 url 替换基本 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

}


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信