首頁 >後端開發 >Golang >如何全域刪除 `time.Now()` 以便於測試?

如何全域刪除 `time.Now()` 以便於測試?

Linda Hamilton
Linda Hamilton原創
2025-01-01 03:38:16396瀏覽

How to Globally Stub Out `time.Now()` for Easier Testing?

如何全域存根time.Now() 進行測試

在編碼中,某些元素可能對時間敏感,需要操作用於測試目的的時間。一種方法是在測試中刪除 time.Now() 。然而,time.Now() 被頻繁調用,因此需要維護一個變數來監控實際經過的睡眠時間。

本文研究了全域消除 time.Now() 的替代方法,包括使用自訂介面以及建立修改後的「時間」套件的可能性。

自訂介面方法

自訂介面方法涉及實作類似以下的介面:

type Clock interface {
  Now() time.Time
  After(d time.Duration) <-chan time.Time
}

此介面為Now() 和介面為Now() 和介面After() 方法提供佔位符,讓您定義測試和生產的具體實作。例如:

type realClock struct{}

func (realClock) Now() time.Time { return time.Now() }
func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }

潛在問題

雖然自訂介面方法很有效,但它也有一些警告:

  • 傳遞介面變數:您可能需要將時脈介面作為參數傳遞給函數和使用time.Now().
  • 無全域替換: 此方法不提供 time.Now().

替代方法

  • 修改「時間」包:可以建立一個修改後的「時間」包,它包裝標準庫的時間包,並提供切換到模擬時間庫進行測試的機制。
  • 無狀態代碼設計: 為了避免副作用並方便測試,請考慮使用無狀態設計代碼

警告:

警告:

警告:

警告:警告:在執行測試時或一般情況下不建議更改系統時間,因為它可能會導致意外的依賴關係和偵錯問題。 結論存根time.Now() 全域測驗需要仔細考慮。雖然自訂介面方法是一個可行的選擇,但它可能會帶來額外的複雜性。或者,您可以建立修改後的「時間」套件或使用無狀態元件設計程式碼以簡化測試。

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

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