71

私たちのコードの一部は時間に敏感で、何かを予約してから 30 ~ 60 秒でリリースできるようにする必要があります。time.Sleep(60 * time.Second)

私は時間インターフェイスを実装したばかりで、テスト中に時間インターフェイスのスタブ化された実装を使用します。

ただし、time.Now()複数のサイトで呼び出されるため、実際に眠った時間を追跡するために変数を渡す必要があります。

time.Now()グローバルにスタブアウトする別の方法があるかどうか疑問に思っていました。システムクロックを変更するためにシステムコールを行っているのでしょうか?

基本的に時間パッケージをラップする独自の時間パッケージを作成できますが、それを変更することはできますか?

私たちの現在の実装はうまく機能しています。私は囲碁の初心者で、他のアイデアがあるかどうか知りたいですか?

4

10 に答える 10

8

また、スタブだけが必要な場合はtime.Now、依存関係を関数として注入できます。

func moonPhase(now func() time.Time) {
  if now == nil {
    now = time.Now
  }

  // use now()...
}

// Then dependent code uses just
moonPhase(nil)

// And tests inject own version
stubNow := func() time.Time { return time.Unix(1515151515, 0) }
moonPhase(stubNow)

動的言語のバックグラウンド (Ruby など) の出身である場合、少し醜いことはすべて認められています :(

于 2014-09-11T15:35:31.567 に答える