Simulare il client gRPC nei test
Nota
Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 9 di questo articolo.
Avviso
Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere i criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 9 di questo articolo.
Importante
Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Per la versione corrente, vedere la versione .NET 9 di questo articolo.
Il test è un aspetto importante della creazione di software stabile e gestibile. Parte della scrittura di test di alta qualità consiste nel rimuovere dipendenze esterne. Questo articolo illustra l'uso di client gRPC fittizi nei test per rimuovere le chiamate gRPC ai server esterni.
Esempio di app client testabile
Per illustrare i test delle app client, esaminare il tipo seguente nell'app di esempio.
Visualizzare o scaricare il codice di esempio (procedura per il download)
Worker
è un oggetto BackgroundService che effettua chiamate a un server gRPC.
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);
}
}
}
Tipo precedente:
- Segue il principio delle dipendenze esplicite.
TesterClient
viene generato automaticamente dal pacchetto di strumenti Grpc.Tools basato sul file test.proto durante il processo di compilazione.- Prevede l'inserimento delle dipendenze (DI) per fornire istanze di
TesterClient
eIGreetRepository
. L'app è configurata per l'uso della factory client gRPC per creareTesterClient
. - Può essere testato con un servizio fittizio
IGreetRepository
eTesterClient
un client usando un framework di oggetti fittizi, ad esempio Moq. Un oggetto fittizio è un oggetto creato con un set predeterminato di comportamenti di proprietà e metodi usati per il testing. Per altre informazioni, vedere Test di integrazione in ASP.NET Core.
Per altre informazioni sugli asset C# generati automaticamente da Grpc.Tools, vedere Servizi gRPC con C#: Asset C# generati.
Simulare un client gRPC
I client gRPC sono tipi client concreti generati da file .proto
. Il client gRPC concreto include metodi che si traducono nel servizio gRPC nel file .proto
. Ad esempio, un servizio denominato Greeter
genera un GreeterClient
tipo con metodi per chiamare il servizio.
Un framework fittizio può simulare un tipo di client gRPC. Quando un client fittizio viene passato al tipo, il test usa il metodo fittizio anziché inviare una chiamata gRPC a un server.
[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"));
}
Lo unit test precedente:
IGreetRepository
Simula eTesterClient
usa Moq.- Avvia il ruolo di lavoro.
SaveGreeting
Verifica che venga chiamato con il messaggio di saluto restituito dall'oggetto fittizioTesterClient
.