ホームページ > バックエンド開発 > Golang > Golang 単体テストで「time.Now()」を効果的にスタブアウトする方法は?

Golang 単体テストで「time.Now()」を効果的にスタブアウトする方法は?

Susan Sarandon
リリース: 2025-01-01 00:00:12
オリジナル
590 人が閲覧しました

How to Effectively Stub Out `time.Now()` for Golang Unit Tests?

単体テスト用に time.Now() をグローバルにスタブアウトする方法

時間に敏感なアプリケーションでは、単体テストで現在時刻を正確にモックすることが重要になる場合があります。ただし、time.Now() は複数の場所で呼び出されることが多く、経過時間を正確に追跡することが困難になります。

カスタム インターフェイスの使用

参照した golang-nuts スレッドで提案されている解決策は、時間パッケージの機能をラップするカスタム Clock インターフェイスを定義することで確実なアプローチを提供します。

type Clock interface {
  Now() time.Time
  After(d time.Duration) <-chan time.Time
}
ログイン後にコピー

このインターフェイスは次のように実装できます。次のような具体的な実装:

type realClock struct{}
func (realClock) Now() time.Time { return time.Now() }
func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }
ログイン後にコピー

テスト用に、Clock インターフェースのモック実装を作成します。

システム時刻変更の処理

変更したくなるかもしれませんが、テストのためにシステム時間をグローバルに使用するため、このアプローチは強く推奨されません。予測できない依存関係や副作用が発生する可能性があります。

カスタム時間パッケージ

代わりに、標準ライブラリの時間パッケージをラップするカスタム時間パッケージの作成を検討してください。このカスタム パッケージは、テスト中に模擬時間の実装に切り替える機能を提供できます。

時間に敏感なコードのベスト プラクティス

テストの容易性を向上させ、副作用を軽減するには、以下を使用してコードを設計するように努めてください。可能な限りステートレスなコンポーネント。コードを個別のテスト可能な部分に構造化することで、単体テストのプロセスが簡素化され、さまざまな時間条件下で正しい動作を確認することが容易になります。

以上がGolang 単体テストで「time.Now()」を効果的にスタブアウトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート