在時間敏感的應用程式中,準確模擬當前時間對於單元測試至關重要。然而,time.Now() 經常在多個位置調用,這使得準確追蹤經過的時間變得困難。
您引用的golang-nuts 執行緒中建議的解決方案透過定義包裝時間套件功能的自訂Clock 介面提供了可靠的方法:
type Clock interface { Now() time.Time After(d time.Duration) <-chan time.Time }
您可以使用具體實作來實作此介面像這樣:
type realClock struct{} func (realClock) Now() time.Time { return time.Now() } func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }
為了測試,建立Clock介面的模擬實作。
雖然更改系統時間似乎很誘人在全球範圍內進行測試,強烈建議不要採用這種方法。它可能會引入不可預測的依賴關係和副作用。
作為替代方案,請考慮建立一個包裝標準庫時間包的自訂時間包。此自訂套件可以提供在測試期間切換到模擬時間實現的功能。
為了提高可測試性並減少副作用,請嘗試設計您的程式碼盡可能使用無狀態元件。透過將程式碼建置為單獨的、可測試的部分,您可以簡化單元測試流程,並更輕鬆地確保不同時間條件下的正確行為。
以上是如何有效地移除 Golang 單元測試的 `time.Now()` ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!