php小編百草為您介紹一種名為gocron的函數,它是一個標準庫實現,具備可測試的特性。gocron函數的設計目的是為了提供一種簡便的方式來創建和管理定時任務。它可以幫助開發人員輕松地編寫和調度多個定時任務,同時還提供了靈活的測試功能,方便開發人員進行單元測試和功能驗證。無論是在開發環境還是生產環境,gocron函數都是一個強大而可靠的工具,可用于實現各種復雜的定時任務需求。
問題內容
我需要按一定的時間間隔運行作業(點擊休息端點,然后將消息發送到隊列)。目前我有這個功能,它使用 gocron – https://github.com/go-co-op/gocron
但是目前沒有停止該功能的機制,因此我無法干凈地測試它。
func RunSchedule(cronExpression string, myFunction func()) error {
scheduler := gocron.NewScheduler(time.UTC)
_, err := scheduler.Cron(cronExpression).StartImmediately().Do(myFunction)
if err != nil {
return err
}
scheduler.StartBlocking()
return nil
}
登錄后復制
它按要求執行,并以所需的時間間隔運行參數化函數,但我確信必須有一個更清晰的解決方案 – 可能是標準庫。
解決方法
您可以只返回 .stop 函數:
func runschedule(cronexpression string, myfunction func()) (stop func(), err error) {
scheduler := gocron.newscheduler(time.utc)
_, err = scheduler.cron(cronexpression).startimmediately().do(myfunction)
if err != nil {
return nil, err
}
go func() {
scheduler.startblocking()
}()
return scheduler.stop, nil
}
登錄后復制
然后在您的測試中您可以執行以下操作:
called := 0
stop, err := RunSchedule("some-schedule", func() {
called++
})
time.Sleep(time.Second * 1) // whatever you need to do
stop()
if called != 1 {
t.Fail("called should be 1")
}
登錄后復制






