ホームページ >バックエンド開発 >Golang >テストを容易にするために「time.Now()」をグローバルにスタブアウトする方法は?

テストを容易にするために「time.Now()」をグローバルにスタブアウトする方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-01 03:38:16396ブラウズ

How to Globally Stub Out `time.Now()` for Easier Testing?

テストのために time.Now() をグローバルにスタブアウトする方法

コーディングでは、一部の要素は時間に依存するため、操作が必要になる場合があります。テスト目的のための時間。 1 つの方法は、テスト内で time.Now() をスタブアウトすることです。ただし、time.Now() は頻繁に呼び出されるため、実際のスリープ経過時間を監視するために変数のメンテナンスが必要になります。

この記事では、time.Now() をグローバルにスタブアウトするための代替アプローチを検討します。カスタム インターフェイスと、変更された「time」パッケージを作成する可能性。

カスタム インターフェイスアプローチ

カスタム インターフェイス メソッドには、次のようなインターフェイスの実装が含まれます。

type Clock interface {
  Now() time.Time
  After(d time.Duration) <-chan time.Time
}

このインターフェイスは Now() メソッドと After() メソッドのプレースホルダーを提供し、テストと運用のための特定の実装を定義します。例:

type realClock struct{}

func (realClock) Now() time.Time { return time.Now() }
func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }

潜在的な問題

カスタム インターフェイスのアプローチは効果的ですが、次のような注意点があります。

  • インターフェイス変数の受け渡し: クロック インターフェイスをパラメーターとして関数に渡す必要がある場合があります。 time.Now().
  • グローバル置換なし: このメソッドは、time.Now().

のグローバル置換を提供しません。 代替アプローチ

  • "time" パッケージ: 標準ライブラリの time パッケージをラップし、テスト用に模擬時間ライブラリに切り替えるメカニズムを提供する、変更された "time" パッケージを作成することができます。
  • ステートレス コード設計: 副作用を回避し、テストを容易にするために、ステートレスを使用してコードを設計することを検討してください。

注意:

テストの実行中または一般にシステム時刻を変更することは、予期しない依存関係やデバッグの問題につながる可能性があるため推奨されません。

結論

スタブアウトtime.Now() をテストのためにグローバルに使用するには、慎重な検討が必要です。カスタム インターフェイスのアプローチは実行可能なオプションですが、さらに複雑になる可能性があります。あるいは、変更された「時間」パッケージを作成するか、ステートレス コンポーネントを使用してコードを設計して、テストを簡素化することもできます。

以上がテストを容易にするために「time.Now()」をグローバルにスタブアウトする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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