Mock gRPC client trong tests (kiểm thử)
Nguồn: Mock gRPC client in tests
Kiểm thử là một khía cạnh quan trọng để xây dựng phần mềm ổn định và dễ bảo trì. Một phần của việc viết các test chất lượng cao là loại bỏ các external dependencies (phụ thuộc bên ngoài). Bài viết này thảo luận về việc sử dụng mock gRPC client trong tests để loại bỏ các lệnh gọi gRPC đến server bên ngoài.
Ví dụ ứng dụng client có thể kiểm thử
Để minh họa các test ứng dụng client, hãy xem xét type sau trong ứng dụng mẫu.
Worker là một BackgroundService thực hiện các lệnh gọi đến gRPC server.
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);
}
}
}Type trên:
- Tuân theo Nguyên tắc phụ thuộc tường minh.
TesterClientđược tự động tạo bởi tooling package Grpc.Tools dựa trên file test.proto trong quá trình build.- Mong đợi dependency injection (DI) cung cấp các instance của
TesterClientvàIGreetRepository. Ứng dụng được cấu hình để sử dụng gRPC client factory để tạoTesterClient. - Có thể được kiểm thử với
IGreetRepositoryservice vàTesterClientclient được mock bằng mock object framework, chẳng hạn như Moq. Mocked object là một đối tượng được tạo ra với tập hợp các hành vi thuộc tính và method được xác định trước để kiểm thử. Để biết thêm thông tin, xem Integration tests in ASP.NET Core.
Để biết thêm thông tin về các C# asset được tự động tạo bởi Grpc.Tools, xem gRPC services with C#: Generated C# assets.
Mock một gRPC client
gRPC client là các concrete client type được tạo từ các file .proto. gRPC client cụ thể có các method dịch sang gRPC service trong file .proto. Ví dụ: một service có tên Greeter tạo ra type GreeterClient với các method để gọi service.
Mocking framework có thể mock một gRPC client type. Khi một mocked client được truyền vào type, test sử dụng method đã được mock thay vì gửi lệnh gọi gRPC đến server.
[Fact]
public async Task Greeting_Success_RepositoryCalled()
{
// Arrange (chuẩn bị)
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 (thực thi)
await worker.StartAsync(CancellationToken.None);
// Assert (kiểm tra)
mockRepository.Verify(v => v.SaveGreeting("Test"));
}Unit test trên:
- Mock
IGreetRepositoryvàTesterClientbằng Moq. - Khởi động worker.
- Xác minh
SaveGreetingđược gọi với greeting message được trả về bởiTesterClientđã được mock. - Sử dụng
CallHelperstừ các ví dụ gRPC.