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方法,我似乎不清楚應該如何做。
遇到這種情況我該怎么處理呢?誰能給我一個關于這個案例的例子/教程。

TA貢獻1836條經驗 獲得超5個贊
據我所知,在單元測試中有兩種常見的方法可以做到這一點。
首先是模擬請求(例如創建Requester
接口或類似的東西來包裝真正的 GET 請求),然后在單元測試中將其替換為模擬對象。這稱為依賴注入。
第二種方法是使用net/http/httptest
并替換metadataAPIURL
為 localhost URL 來運行測試服務器。
- 2 回答
- 0 關注
- 170 瀏覽
添加回答
舉報