Sdílet prostřednictvím


Napodobení klienta gRPC v testech

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete v tomto článku ve verzi .NET 9.

Autor: James Newton-King

Testování je důležitým aspektem vytváření stabilního a udržovatelného softwaru. Součástí psaní vysoce kvalitních testů je odebrání externích závislostí. Tento článek popisuje použití napodobení klientů gRPC v testech k odebrání volání gRPC na externí servery.

Příklad testovatelné klientské aplikace

Pokud chcete předvést testy klientských aplikací, projděte si následující typ ukázkové aplikace.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Jedná se Worker o službu BackgroundService , která provádí volání serveru 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);
        }
    }
}

Předchozí typ:

  • Řídí se principem explicitních závislostí.
  • TesterClient je automaticky generována balíčkem nástrojů Grpc.Tools na základě souboru test.proto během procesu sestavení.
  • Očekává, že injektáž závislostí (DI) poskytne instance a TesterClient IGreetRepository. Aplikace je nakonfigurovaná tak, aby k vytvoření TesterClientpoužívala klientskou továrnu gRPC .
  • Můžete testovat pomocí napodobené IGreetRepository služby a TesterClient klienta pomocí napodobené objektové architektury, jako je Například Moq. Napodobený objekt je objekt s předem určenou sadou vlastností a chování metod používaných k testování. Další informace najdete v tématu Integrační testy v ASP.NET Core.

Další informace o prostředcích jazyka C# automaticky vygenerovaných nástroji Grpc.Tools najdete v tématu služby gRPC s C#: Generované prostředky jazyka C#.

Napodobení klienta gRPC

Klienti gRPC jsou konkrétní typy klientů, kteří se generují ze souborů .proto. Konkrétní klient gRPC obsahuje metody, které se překládají na službu gRPC v souboru .proto. Například volání Greeter služby generuje GreeterClient typ s metodami volání služby.

Napodobení architektury může napodobovat typ klienta gRPC. Když se do typu předá napodobený klient, test místo odeslání volání gRPC na server použije napodobenou metodu.

[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"));
}

Předchozí test jednotek:

  • Napodobení IGreetRepository a TesterClient použití Moqu
  • Spustí pracovní proces.
  • Ověřuje SaveGreeting , že je volána se zprávou s pozdravem vrácenou napodobením TesterClient.

Další materiály