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() }
カスタム パッケージの利点
カスタム パッケージの欠点
システムに対する注意クロックの変更
時間の経過をシミュレートするテスト中にシステム クロックを変更しないことを強くお勧めします。これにより、正確なシステム時間に依存する他のシステム コンポーネントに予期せぬ結果が生じる可能性があります。
以上がGo でのテストのために `time.Now()` をグローバルに効果的にスタブアウトするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。