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") }
登錄后復制