ホームページ >バックエンド開発 >Golang >Go でのテストのために `time.Now()` をグローバルに効果的にスタブアウトするにはどうすればよいですか?

Go でのテストのために `time.Now()` をグローバルに効果的にスタブアウトするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-01 06:16:10284ブラウズ

How Can I Effectively Stub Out `time.Now()` Globally for Testing in Go?

time.Now() をグローバルにスタブする: 代替手段を探索する

時間に依存する機能に依存するコードをテストする場合、以下の必要性が生じます。時間の進行をシミュレートします。カスタム時間インターフェースの実装は効果的なソリューションですが、実際の経過時間を追跡するために変数を渡す必要があるため、その使用法が煩雑になる可能性があります。

カスタム時間パッケージ

代わりに、標準ライブラリの時間パッケージをラップするカスタム時間パッケージを作成することを検討してください。このアプローチにより、リアルタイム実装とテスト用のモック実装をシームレスに切り替えることができます。例:

// custom_time.go
package custom_time

import (
    "time"
    "sync"
)

var (
    mockTime time.Time
    mockMutex sync.Mutex
)

func SetMockTime(t time.Time) {
    mockMutex.Lock()
    mockTime = t
    mockMutex.Unlock()
}

func ResetMockTime() {
    mockMutex.Lock()
    mockTime = time.Time{}
    mockMutex.Unlock()
}

func Now() time.Time {
    mockMutex.Lock()
    defer mockMutex.Unlock()
    if mockTime != (time.Time{}) {
        return mockTime
    }
    return time.Now()
}

カスタム パッケージの利点

  • グローバル スコープ: このアプローチでは、time.Now() がスタブアウトされます。テスト内の時間パッケージのすべてのインスタンス
  • 簡単な切り替え: 実際の時間と疑似時間の切り替えは、SetMockTime 関数と ResetMockTime 関数を使用して簡単に行えます。
  • 保守性: 個別の時間を維持します。テスト目的のパッケージでコードを強化する

カスタム パッケージの欠点

  • 追加の抽象化: の追加レイヤーにより、わずかなオーバーヘッドが発生する可能性があります。抽象化。

システムに対する注意クロックの変更

時間の経過をシミュレートするテスト中にシステム クロックを変更しないことを強くお勧めします。これにより、正確なシステム時間に依存する他のシステム コンポーネントに予期せぬ結果が生じる可能性があります。

以上がGo でのテストのために `time.Now()` をグローバルに効果的にスタブアウトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。