Erstellung von Api Stubs - Fake Services - in .NET und .NET CORE

Bei der Anbindung von externen http-basierten System ist es praktisch, wenn man für eigene Tests die Abhängigkeit des Fremdsystem durch einen Fake-Service ersetzen kann, der dann abhängig von Parametern die erwartet Antwort liefert. "Praktisch" ist ein  solcher Fake-Service aus folgenden Gründen:

  • Das Ausführen von Tests ist somit unabhängig von externen Systemen ist. Der Test kann dann jederzeit den eigenen SourceCode, gegen das erwartet Verhalten des externen System prüfen
  • Ein solcher Fake-Service ist deutlich schneller - Response Antwortzeit- und somit wird die Ausführungszeiten von Tests erhört
  • Teilweise kommt es vor, dass externe Systeme gar keine Testumgebung zur Verfügung stellen oder das solche System immer wieder neu aufgesetzt werden, womit benötigte Konfigurationen verloren gehen.

Das birgt natürlich das Risko, dass Änderungen an externen Systemen nicht auffallen. Für diesen Fall sollte man wenige Tests haben, die das prüfen. Diese Integrations-Tests müssen aber nicht zwigend immer ausgeführt werden und behindern im Zweifel nicht das Erstellen von neuen Versionen.

Einen solchen Fake-Service - oder auch Stub genannt - kann man in .NET (und .NET CORE) mit Stubbery umsetzen.

Stubbery ist eine Library, mit der man sehr einfach einen Web-Server konfigurieren und starten kann, der dann auf bestimmte Routen mit konfigurierte Ergebnissen antwortet.

Wie auf der Webseite von Stubbery zu sehen, ist die Verwendung sehr einfach:

using (var stub = new ApiStub())
{
    stub.Get(
        "/get",
        (req, args) => "response");

    stub.Start();

    var result = await httpClient.GetAsync(new UriBuilder(new Uri(stub.Address)) { Path = "/get" }.Uri);

    // resultString will contain "response"
    var resultString = await result.Content.ReadAsStringAsync();
}

Für die Erstellung eines Stubs muss man eine neue Instanz der Klasse ApiStub erstellen, die Routen (Endpunkte) werden mit den Http-Verben Get, Post, Put und Delete definiert und anschließen wird durch den Aufruf der Methode Start() der Server gestartet. Der erzeugte Server ist über localhost und einem Zufallsport ansprechbar - die aktuelle Uri erhält man durch die Eigenschaft Address der erzeugten Instanz von ApiStub.

Die Instanz sollte entweder in einem using Block verwendet werden. Alternativ kann man auch durch den Aufruf von Dispose() den benutzten Port wieder freigeben.

In dem Github-Repro gibt es noch ein ausführlicheres Beispiel.

 

Kommentare sind geschlossen