Condividi tramite


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.

Da: James Newton-King

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 e IGreetRepository. L'app è configurata per l'uso della factory client gRPC per creare TesterClient.
  • Può essere testato con un servizio fittizio IGreetRepository e TesterClient 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 e TesterClient usa Moq.
  • Avvia il ruolo di lavoro.
  • SaveGreeting Verifica che venga chiamato con il messaggio di saluto restituito dall'oggetto fittizio TesterClient.

Risorse aggiuntive