Simulación del cliente gRPC en pruebas
Nota:
Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión .NET 8 de este artículo.
Advertencia
Esta versión de ASP.NET Core ya no se admite. Para obtener más información, consulte la Directiva de soporte técnico de .NET y .NET Core. Para la versión actual, consulte la versión .NET 8 de este artículo.
Importante
Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.
Para la versión actual, consulte la versión .NET 8 de este artículo.
Las pruebas son un aspecto importante de la creación de software estable y fácil de mantener. Parte de la escritura de pruebas de alta calidad consiste en quitar dependencias externas. En este artículo se describe el uso de clientes gRPC ficticios en pruebas para eliminar llamadas gRPC a servidores externos.
Ejemplo de aplicación cliente que se puede probar
Para una demostración de las pruebas de una aplicación cliente, revise el siguiente tipo en la aplicación de ejemplo.
Vea o descargue el código de ejemplo (cómo descargarlo)
Worker
es una clase BackgroundService que realiza llamadas a un servidor de 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);
}
}
}
El tipo anterior:
- Sigue el Principio de dependencias explícitas.
TesterClient
lo genera automáticamente el paquete de herramientas Grpc.Tools en función del archivo test.proto, durante el proceso de compilación.- Espera la inserción de dependencias (DI) para ofrecer instancias de
TesterClient
yIGreetRepository
. La aplicación está configurada para usar la fábrica de cliente de gRPC para crearTesterClient
. - Se puede probar con un servicio
IGreetRepository
y un clienteTesterClient
ficticio con el uso de un marco de objeto ficticio, como Moq. Un objeto ficticio es un objeto fabricado con un conjunto predeterminado de comportamientos de propiedades y métodos utilizados para las pruebas. Para más información, vea Pruebas de integración en ASP.NET Core.
Para obtener más información sobre los recursos de C# que Grpc.Tools ha generado automáticamente, consulte Servicios gRPC con C#: Recursos de C# generados.
Simulación de un cliente gRPC
Los clientes gRPC son tipos de cliente concretos que se generan a partir de archivos .proto
. El cliente gRPC concreto tiene métodos que se convierten en el servicio gRPC en el archivo .proto
. Por ejemplo, un servicio denominado Greeter
genera un tipo GreeterClient
con métodos para llamar al servicio.
Un marco de simulación puede simular un tipo de cliente gRPC. Cuando se pasa un cliente ficticio al tipo, la prueba usa el método simulado en lugar de enviar una llamada gRPC a un servidor.
[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"));
}
La prueba unitaria anterior:
- Simula
IGreetRepository
yTesterClient
mediante Moq. - Inicia el trabajo.
- Comprueba que se llama a
SaveGreeting
con el mensaje de saludo devuelto por el elemento ficticioTesterClient
.