時間に敏感なアプリケーションでは、単体テストで現在時刻を正確にモックすることが重要になる場合があります。ただし、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 サイトの他の関連記事を参照してください。