Neu in .NET 8.0 [18]: Ein Zeitraffer mit eigenem FakeTimeProvider

Auf Basis der Klasse TimeProvider kann man sich in .NET 8.0 einen eigenen TimeProvider erstellen, der in Tests Uhrzeiten vorgaukelt.

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen
5,Min,Before,12,O`clock,On,A,Wall,Clock

(Bild: r.classen/Shutterstock.com)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Der vorherige Blogbeitrag zu den Neuerungen in .NET 8.0 hat die darin neu eingefĂĽhrte Klasse System.TimeProvider sowie den darauf aufbauende FakeTimeProvider von Microsoft im NuGet-Paket Microsoft.Extensions.TimeProvider.Testing behandelt.

Man kann aber einen FakeTimeProvider auch selbst schreiben. Die Klasse ITVisionsFakeTimeProvider implementiert im folgenden Listing einen eigenen Provider auf Basis der abstrakten Basisklasse System.TimeProvider. Dieser ITVisionsFakeTimeProvider gibt immer die gleiche Zeit zurĂĽck, die im Konstruktor ĂĽbergeben wurde und kann mit Advance() vorgestellt werden.

Zusätzlich zu der Implementierung von Microsoft bietet die Klasse einen einstellbaren Zeitraffer. Beispielsweise dauert das Warten nur zwei statt sechs Sekunden durch die Angabe von 3 als Zeitraffer im Konstruktor:

ITVisionsFakeTimeProvider ftp = 
  new(DateTime.Parse("14.11.2023 18:00:00"), 3); 
await ftp.Delay(new TimeSpan(0, 0, 6));
// oder
await Task.Delay(new TimeSpan(0, 0, 5), ftp);

Der Zeitraffer wirkt auch auf Timer. Während dieser Timer alle drei Sekunden auslöst

TimeProvider.System.CreateTimer
  ((x) => Callback(TimeProvider.System), 
  null, 
  new TimeSpan(0, 0, 3),
  new TimeSpan(0, 0, 3));

erfolgt hier aufgrund des Zeitraffers 3 die Auslösung jede Sekunde:

ftp.CreateTimer((x) => Callback(ftp), 
                null, 
                new TimeSpan(0, 0, 3),
                new TimeSpan(0, 0, 3));

Hier ist ein Codebeispiel mit dem ITVisionsFakeTimeProvider:

/// <summary>
/// Dieser FakeTimeProvider gibt immer die gleiche Zeit zurĂĽck, 
/// die im Konstruktor ĂĽbergeben wurde. Der Timer kann vorgestellt
/// werden mit Advance(). FĂĽr den Timer gibt es einen Zeitraffer.
/// </summary>
class ITVisionsFakeTimeProvider : TimeProvider
{
 private readonly DateTimeOffset _date;
 int _timeLapse = 1;
 public ITVisionsFakeTimeProvider(DateTimeOffset date, 
                                  int timeLapse = 1)
 {
  _date = date;
  _timeLapse = timeLapse;
 }
 public override DateTimeOffset GetUtcNow()
 {
  return _date;
 }
 
 /// <summary>
 /// Zeit vorstellen
 /// </summary>
 public void Advance(TimeSpan timeSpan)
 {
  _date.Add(timeSpan);
 }
 
 /// <summary>
 /// Timer mit Zeitraffer
 /// </summary>
 public override ITimer CreateTimer(TimerCallback callback, 
                                    object state, 
                                    TimeSpan dueTime, 
                                    TimeSpan period)
 {
  return base.CreateTimer(callback, state, 
             new TimeSpan((long)(dueTime.Ticks / _timeLapse)), 
             new TimeSpan((long)(period.Ticks / _timeLapse)));
 }
 
}
Online-Konferenz zu .NET 9.0 am 19. November

(Bild: Dmytro Vikarchuk/Shutterstock)

In der Online-Konferenz betterCode() .NET 9.0 am 19. November 2024 von iX und dpunkt.verlag werden .NET-Experten von www.IT-Visions.de den fertigen Stand von .NET 9.0 anhand von Praxisbeispielen präsentieren. Dazu zählen die Neuerungen bezüglich des .NET 9.0 SDK, C# 13.0, ASP.NET Core 9.0, Blazor 9.0, OR-Mapping mit Entity Framework Core 9.0, Windows Forms 9.0, WPF 9.0, WinUI, Cross-Plattform-Entwicklung mit .NET MAUI 9.0 und ein Ausblick auf .NET 10.0.

Der Ticketverkauf ist bereits gestartet: Vor Bekanntgabe des Programms sind vergünstigte Blind-Bird-Tickets erhältlich.

(rme)