首頁 >後端開發 >Golang >gocron函數的標準函式庫實作(可測試)

gocron函數的標準函式庫實作(可測試)

王林
王林轉載
2024-02-15 12:51:081052瀏覽

gocron函數的標準函式庫實作(可測試)

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

以上是gocron函數的標準函式庫實作(可測試)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除