首頁 >後端開發 >Golang >如何在 Go 中有效地全域刪除 `time.Now()` 進行測試?

如何在 Go 中有效地全域刪除 `time.Now()` 進行測試?

Barbara Streisand
Barbara Streisand原創
2025-01-01 06:16:10301瀏覽

How Can I Effectively Stub Out `time.Now()` Globally for Testing in Go?

全域消除time.Now():探索替代方案

測試依賴時間敏感功能的程式碼時,需要模擬時間進展。雖然實作自訂時間介面可能是一種有效的解決方案,但由於需要傳遞變數來追蹤實際經過的時間,其使用可能會變得很麻煩。

自訂時間包

作為替代方案,請考慮建立一個包含標準庫時間包的自訂時間包。這種方法可讓您在即時實現和模擬實現之間無縫切換以進行測試。例如:

// custom_time.go
package custom_time

import (
    "time"
    "sync"
)

var (
    mockTime time.Time
    mockMutex sync.Mutex
)

func SetMockTime(t time.Time) {
    mockMutex.Lock()
    mockTime = t
    mockMutex.Unlock()
}

func ResetMockTime() {
    mockMutex.Lock()
    mockTime = time.Time{}
    mockMutex.Unlock()
}

func Now() time.Time {
    mockMutex.Lock()
    defer mockMutex.Unlock()
    if mockTime != (time.Time{}) {
        return mockTime
    }
    return time.Now()
}

自訂套件的優點

  • 全域範圍:此方法將time.Now() 存根測試範圍內時間包的所有實例。
  • 簡單切換:使用 SetMockTime 和 ResetMockTime 函數可以直接在真實時間和模擬時間之間切換。
  • 可維護性:保留單獨的時間包用於測試目的可以增強程式碼組織。

客製化的缺點包

  • 額外抽象:由於額外的抽象層可能會帶來輕微的開銷。

系統警告時鐘修改

強烈建議不要在運行期間修改系統時鐘模擬時間進展的測試。這可能會為依賴準確系統時間的其他系統元件帶來不可預測的後果。

以上是如何在 Go 中有效地全域刪除 `time.Now()` 進行測試?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn