Simulieren des gRPC-Clients in Tests
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Wichtig
Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.
Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Testen ist ein wichtiger Aspekt beim Erstellen stabiler und verwaltbarer Software. Zum Schreiben hochwertiger Tests gehört auch das Entfernen externer Abhängigkeiten. In diesem Artikel wird erläutert, wie gRPC-Pseudoclients in Tests verwendet werden, um gRPC-Aufrufe an externe Server zu entfernen.
Beispiel einer testfähige Client-App
Um mehr über Client-App-Tests zu erfahren, sehen Sie sich den folgenden Typ in der Beispiel-App an.
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Der Worker
ist ein BackgroundService, der Aufrufe an einen gRPC-Server sendet.
public class Worker : BackgroundService
{
private readonly Tester.TesterClient _client;
private readonly IGreetRepository _greetRepository;
public Worker(Tester.TesterClient client, IGreetRepository greetRepository)
{
_client = client;
_greetRepository = greetRepository;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var count = 0;
while (!stoppingToken.IsCancellationRequested)
{
count++;
var reply = await _client.SayHelloUnaryAsync(
new HelloRequest { Name = $"Worker {count}" });
_greetRepository.SaveGreeting(reply.Message);
await Task.Delay(1000, stoppingToken);
}
}
}
Für den vorangehenden Typ gilt Folgendes:
- Er folgt dem Prinzip der expliziten Abhängigkeiten.
TesterClient
wird automatisch vom Toolpaket Grpc.Tools basierend auf der test.proto-Datei während des Buildvorgangs generiert.- Er erwartet, dass per Abhängigkeitsinjektion (Dependency Injection, DI) eine Instanz von
TesterClient
undIGreetRepository
bereitgestellt wird. Die App ist für die Verwendung der gRPC-Clientfactory zum Erstellen vonTesterClient
konfiguriert. - Er kann mit einem simulierten
IGreetRepository
-Dienst und einemTesterClient
-Client unter Verwendung eines Pseudoobjektframeworks wie Moq getestet werden. Ein Pseudoobjekt ist ein künstliches Objekt mit einem vordefiniertem Satz von Eigenschaften und Methodenverhalten, das zum Testen verwendet wird. Weitere Informationen finden Sie unter Integrationstests in ASP.NET Core.
Weitere Informationen zu den von Grpc.Tools automatisch generierten C#-Ressourcen finden Sie unter gRPC-Dienste mit C#: Generierte C#-Ressourcen.
Simulieren eines gRPC-Clients
gRPC-Clients sind konkrete Clienttypen, die aus .proto
-Dateien generiert werden. Der konkrete gRPC-Client verfügt über Methoden, die in den gRPC-Dienst in der .proto
-Datei übersetzt werden. Beispielsweise generiert ein Dienst namens Greeter
einen GreeterClient
-Typ mit Methoden zum Aufrufen des Diensts.
Ein Pseudoframework kann einen gRPC-Clienttyp simulieren. Wenn ein Pseudoclient an den Typ übergeben wird, verwendet der Test die Pseudomethode, anstatt einen gRPC-Aufruf an einen Server zu senden.
[Fact]
public async Task Greeting_Success_RepositoryCalled()
{
// Arrange
var mockRepository = new Mock<IGreetRepository>();
var mockCall = CallHelpers.CreateAsyncUnaryCall(new HelloReply { Message = "Test" });
var mockClient = new Mock<Tester.TesterClient>();
mockClient
.Setup(m => m.SayHelloUnaryAsync(
It.IsAny<HelloRequest>(), null, null, CancellationToken.None))
.Returns(mockCall);
var worker = new Worker(mockClient.Object, mockRepository.Object);
// Act
await worker.StartAsync(CancellationToken.None);
// Assert
mockRepository.Verify(v => v.SaveGreeting("Test"));
}
Für den vorherigen Komponententest gilt Folgendes:
- Simuliert
IGreetRepository
undTesterClient
mithilfe von Moq. - Startet den Worker.
- Überprüft, ob
SaveGreeting
mit der vom nachgebildetenTesterClient
zurückgegebenen Begrüßungsnachricht aufgerufen wird.
Zusätzliche Ressourcen
ASP.NET Core