亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我應該如何對包含對外部服務的 GET 調用的方法進行單元測試

我應該如何對包含對外部服務的 GET 調用的方法進行單元測試

Go
偶然的你 2023-08-07 14:32:25
我正在使用 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 請求,這不是想要的結果。如果我想使用模擬,我應該有一個接口,并在依賴關系和模擬之間切換。測試方法應該很棒GetOperation,但是對于getKeys方法,我似乎不清楚應該如何做。遇到這種情況我該怎么處理呢?誰能給我一個關于這個案例的例子/教程。
查看完整描述

2 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

我正在使用 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 請求,這不是想要的結果。


如果我想使用模擬,我應該有一個接口,并在依賴關系和模擬之間切換。


測試方法應該很棒GetOperation,但是對于getKeys方法,我似乎不清楚應該如何做。


遇到這種情況我該怎么處理呢?誰能給我一個關于這個案例的例子/教程。


查看完整回答
反對 回復 2023-08-07
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

據我所知,在單元測試中有兩種常見的方法可以做到這一點。

首先是模擬請求(例如創建Requester接口或類似的東西來包裝真正的 GET 請求),然后在單元測試中將其替換為模擬對象。這稱為依賴注入。

第二種方法是使用net/http/httptest并替換metadataAPIURL為 localhost URL 來運行測試服務器。


查看完整回答
反對 回復 2023-08-07
  • 2 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號