Documentation ¶
Overview ¶
Package clock provides an abstraction for system time that enables testing of time-sensitive code.
Where you'd use time.Now, instead use clk.Now where clk is an instance of Clock.
When running your code in production, pass it a Clock given by Default() and when you're running it in your tests, pass it an instance of Clock from NewFake().
When you do that, you can use FakeClock's Add and Set methods to control how time behaves in your code making them more reliable while also expanding the space of problems you can test.
This code intentionally does not attempt to provide an abstraction over time.Ticker and time.Timer because Go does not have the runtime or API hooks available to do reliably. See https://github.com/golang/go/issues/8869
Be sure to test Time equality with time.Time#Equal, not ==.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Clock ¶
type Clock interface { // Now returns the Clock's current view of the time. Mutating the // returned Time will not mutate the clock's time. Now() time.Time Sleep(time.Duration) }
Clock is an abstraction over system time. New instances of it can be made with Default and NewFake.
Example ¶
c := Default() now := c.Now() fmt.Println(now.UTC().Zone())
Output: UTC 0
type FakeClock ¶
type FakeClock interface { Clock // Adjust the time that will be returned by Now. Add(d time.Duration) // Set the Clock's time to exactly the time given. Set(t time.Time) }
FakeClock is a Clock with additional controls. The return value of Now return can be modified with Add. Use NewFake to get a thread-safe FakeClock implementation.
Example ¶
c := Default() fc := NewFake() fc.Add(20 * time.Hour) fc.Add(-5 * time.Minute) // negatives work, as well if fc.Now().Equal(fc.Now()) { fmt.Println("FakeClocks' Times always equal themselves.") } if !c.Now().Equal(fc.Now()) { fmt.Println("Clock and FakeClock can be set to different times.") } if !fc.Now().Equal(NewFake().Now()) { fmt.Println("FakeClocks work independently, too.") }
Output: FakeClocks' Times always equal themselves. Clock and FakeClock can be set to different times. FakeClocks work independently, too.