亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有一種簡單的方法可以在測試期間全局排除 time.Now() ?

有沒有一種簡單的方法可以在測試期間全局排除 time.Now() ?

Go
慕容708150 2021-06-08 03:08:41
我們的部分代碼是時間敏感的,我們需要能夠保留一些東西,然后在 30-60 秒內釋放它等等,我們可以做一個 time.Sleep(60 * time.Second)我剛剛實現了時間接口,并在測試期間使用了時間接口的存根實現,類似于這個 golang-nuts 討論。然而,time.Now()在多個站點中被調用,這意味著我們需要傳遞一個變量來跟蹤我們實際睡了多少時間。我想知道是否有另一種方法可以在time.Now()全球范圍內進行存根。也許進行系統調用來更改系統時鐘?也許我們可以編寫我們自己的時間包,它基本上環繞時間包但允許我們更改它?我們目前的實現效果很好,我是一個初學者,我很想知道是否有人有其他想法?
查看完整描述

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) }

和測試實現。

在進行測試(或一般情況下)時更改系統時間是一個壞主意。您不知道在執行測試時什么取決于系統時間,并且您不想通過花費數天的時間調試來找出困難的方法。只是不要這樣做。


也沒有辦法在全局范圍內隱藏時間包,這樣做不會做任何你不能用接口解決方案做的事情。您可以編寫自己的時間包,它使用標準庫并提供一個函數來切換到模擬時間庫以測試它是否是您需要通過困擾您的接口解決方案傳遞的時間對象。


設計和測試代碼的最佳方法可能是使盡可能多的代碼無狀態。將您的功能拆分為可測試的無狀態部分。分別測試這些組件要容易得多。此外,更少的副作用意味著更容易讓代碼并發運行。


查看完整回答
反對 回復 2021-06-28
?
繁花不似錦

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


查看完整回答
反對 回復 2021-06-28
  • 3 回答
  • 0 關注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號