3 回答

TA貢獻1934條經驗 獲得超2個贊
通過實現自定義界面,您已經走上了正確的道路。我認為您使用了您發布的 golang 堅果線程中的以下建議:
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) }
和測試實現。
在進行測試(或一般情況下)時更改系統時間是一個壞主意。您不知道在執行測試時什么取決于系統時間,并且您不想通過花費數天的時間調試來找出困難的方法。只是不要這樣做。
也沒有辦法在全局范圍內隱藏時間包,這樣做不會做任何你不能用接口解決方案做的事情。您可以編寫自己的時間包,它使用標準庫并提供一個函數來切換到模擬時間庫以測試它是否是您需要通過困擾您的接口解決方案傳遞的時間對象。
設計和測試代碼的最佳方法可能是使盡可能多的代碼無狀態。將您的功能拆分為可測試的無狀態部分。分別測試這些組件要容易得多。此外,更少的副作用意味著更容易讓代碼并發運行。

TA貢獻1851條經驗 獲得超4個贊
如果您需要模擬的方法很少,例如Now(),您可以創建一個可以被測試覆蓋的包變量:
package foo
import "time"
var Now = time.Now
// The rest of your code...which calls Now() instead of time.Now()
然后在您的測試文件中:
package foo
import (
"testing"
"time"
)
var Now = func() time.Time { return ... }
// Your tests
- 3 回答
- 0 關注
- 229 瀏覽
添加回答
舉報