gpt4 book ai didi

unit-testing - 我应该如何对包含对外部服务的 GET 调用的方法进行单元测试

转载 作者:行者123 更新时间:2023-11-28 20:34:42 26 4
gpt4 key购买 nike

我正在使用 Gin Gonic 在我的 Go API 中编写单元测试代码。

这是我的代码。

func getKeys(c *gin.Context) {
var meters []models.Meter

metadataOperation, err := metadata.GetOperation("AC123456")
if err != nil {
sendInternalError(err, c)
return
}
meter, err := metadata.GetMeter("12345")
// Other instructions
// ...
// operation = ...
c.JSON(http.StatusOK, operation)
}

这是 GetOperation 方法:

func GetOperation(operationID string) (Operation, error) {
var operation Operation
var url = metadataAPIURL + "/v2/operations/" + operationID
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
req, err := http.NewRequest("GET", url, nil)

if err != nil {
return Operation{}, err
}
req.SetBasicAuth(metadataAPIUser, metadataAPIPassword)
res, err := client.Do(req)
if err != nil {
return Operation{}, err
}
if res.StatusCode != 200 {
return Operation{}, errors.New(res.Status)
}
err = json.NewDecoder(res.Body).Decode(&operation)
if err != nil {
return Operation{}, err
}
return operation, nil
}

metadata.GetOperation("AC123456") 将向外部服务发出 GET 请求。

据我了解单元测试,我不能有任何外部依赖项。

在我的例子中,测试通过了,但它正在向我的生产服务器发出 GET 请求,这不是想要的结果。

如果我想使用模拟,我应该有一个接口(interface),并在依赖和模拟之间切换。

测试GetOperation方法应该很好,但是对于getKeys方法,我似乎不清楚该怎么做。

我应该如何处理这种情况?谁能给我一个关于这个案例的例子/教程。

最佳答案

首先,重构您的 GetOperation 方法以接受 URL 作为参数。

func GetOperation(url, operationID string) (Operation, error)...

然后,使用net/http/httptest 并创建一个测试服务器:

    testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
res.WriteHeader(http.StatusOK)
res.Write(expectedData)
}))
defer func() { testServer.Close() }()

最后,将测试服务器 URL 作为参数传递给 GetOperation:

GetOperation(testServer.URL, 'some-operation')

验证该函数是否正确调用 url 并检索您已传递到测试服务器的 expectedData

关于unit-testing - 我应该如何对包含对外部服务的 GET 调用的方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58990417/

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