Simuler un client dans les tests
Remarque
Ceci n’est pas la dernière version de cet article. Pour la version actuelle, consultez la version .NET 9 de cet article.
Avertissement
Cette version d’ASP.NET Core n’est plus prise en charge. Pour plus d’informations, consultez la stratégie de support .NET et .NET Core. Pour la version actuelle, consultez la version .NET 9 de cet article.
Important
Ces informations portent sur la préversion du produit, qui est susceptible d’être en grande partie modifié avant sa commercialisation. Microsoft n’offre aucune garantie, expresse ou implicite, concernant les informations fournies ici.
Pour la version actuelle, consultez la version .NET 9 de cet article.
Par : James Newton-King
Les tests sont un aspect important de la création de logiciels stables et maintenables. Une partie des tests d’écriture de haute qualité consiste à supprimer les dépendances externes. Cet article décrit l’utilisation de clients gRPC fictifs dans les tests pour supprimer les appels gRPC vers des serveurs externes.
Exemple d’application client testable
Pour illustrer les tests d’application client, consultez le type suivant dans l’exemple d’application.
Affichez ou téléchargez l’exemple de code (procédure de téléchargement)
Le Worker
est un BackgroundService qui effectue des appels à un serveur 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);
}
}
}
Le type précédent :
- Suit le Principe des dépendances explicites.
TesterClient
est généré automatiquement par le package d’outils Grpc.Tools basé sur le fichier test.proto, pendant le processus de génération.- Attend l’injection de dépendance pour fournir une instance de
TesterClient
et deIGreetRepository
. L’application est configurée pour utiliser la fabrique de client gRPC pour créerTesterClient
. - Peut être testé avec un service
IGreetRepository
fictif et le clientTesterClient
au moyen d’une infrastructure d’objets fictifs, telle que Moq. Un objet fictif est un objet fabriqué avec un ensemble prédéterminé de comportements de propriété et de méthode utilisés pour les tests. Pour plus d’informations, consultez Tests d’intégration dans ASP.NET Core.
Pour plus d’informations sur les ressources C# générées automatiquement par Grpc.Tools, consultez Services gRPC avec C# : ressources C# générées.
Simuler un client gRPC
Les clients gRPC sont des types de client concrets générés à partir de fichiers .proto
. Le client gRPC concret a des méthodes qui sont traduites pour le service gRPC dans le fichier .proto
. Par exemple, un service appelé Greeter
génère un type GreeterClient
avec des méthodes pour appeler le service.
Une infrastructure de simulation peut simuler un type de client gRPC. Lorsqu’un client fictif est passé au type, le test utilise la méthode fictive au lieu d’envoyer un appel gRPC à un serveur.
[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"));
}
Le test unitaire précédent :
- Simule
IGreetRepository
etTesterClient
à l’aide de Moq. - Démarre le travail.
- Vérifie si
SaveGreeting
est appelé avec le message d’accueil renvoyé par leTesterClient
simulé.