在 Go 中測試常數
在 Go 中,常數是確保程式碼一致性和正確性的寶貴工具。然而,當涉及單元測試時,使用常數可能會帶來挑戰。本文探討如何在 Go 中重新定義專門用於測試目的的常數。
常數的挑戰
Go 中的常數是不可變的值,在程式執行期間無法修改。這種不變性確保了程式狀態的完整性並防止意外變更。然而,在測試過程中,可能需要暫時修改常數來測試特定場景。
測試友善的方法
請考慮以下範例:
package main
const baseUrl = "http://google.com"
// in main_test.go
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
...
}))
const baseUrl = ts.URL // Error: const baseUrl already defined
在這個例子中,我們希望使用測試伺服器而不是呼叫遠端API進行測試。為此,我們需要使用測試伺服器的 URL 重新定義 baseUrl。然而,Go 會拋出錯誤,因為常數 baseUrl 已經定義了。
解決方案:重構可測試性
為了讓測試更容易,我們可以稍微重建程式碼,引入附加功能:
const baseUrl_ = "http://google.com"
func MyFunc() string {
// Call other function passing the const value
return myFuncImpl(baseUrl_)
}
func myFuncImpl(baseUrl string) string {
// use baseUrl
// Same implementation that was in your original MyFunc() function
}
在此重構程式碼中,原始 MyFunc 函數將其實作委託給 myFuncImpl,該函數採用 baseUrl 參數。這允許我們直接從測試函數呼叫 myFuncImpl 並傳入任何所需的基本 URL。
維持生產程式碼安全
原始 MyFunc 函數保持安全且不受重構。它總是將常數baseUrl_傳遞給myFuncImpl,確保生產程式碼不會因修改常數而出現意外行為。
結論
這種技術允許開發人員重新定義常數用於測試目的,同時保持生產程式碼的完整性和安全性。透過引入提供與原始功能相同的功能的附加函數,測試可以修改常數而不影響實際程式碼的行為。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3