ASP.NET Core: Giả lập máy khách gRPC trong các thử nghiệm
Trong bài viết này
Thử nghiệm là một khía cạnh quan trọng của việc xây dựng phần mềm ổn định và có thể bảo trì. Một phần của việc viết thử nghiệm chất lượng cao là loại bỏ các phụ thuộc bên ngoài. Bài viết này thảo luận về việc sử dụng máy khách gRPC giả lập trong các thử nghiệm nhằm loại bỏ lệnh gọi gRPC tới máy chủ bên ngoài.
Ví dụ về ứng dụng khách có thể thử nghiệm
Để chứng minh thử nghiệm ứng dụng khách, hãy xem lại kiểu sau trong ứng dụng mẫu.
Xem hoặc tải xuống code mẫu ( cách tải xuống )
Worker
là một BackgroundService thực hiện lời gọi đến máy chủ 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);
}
}
}
Kiểu trên:
- Tuân theo Nguyên tắc phụ thuộc tường minh.
TesterClient
được tạo tự động bởi gói công cụ Grpc.Tools dựa trên file test.proto trong quá trình xây dựng.- Dự kiến việc chèn phụ thuộc (DI) sẽ cung cấp các thể hiện của
TesterClient
vàIGreetRepository
. Ứng dụng được định cấu hình để sử dụng factory máy khách gRPC để tạo các fileTesterClient
. - Có thể được thử nghiệm với dịch vụ
IGreetRepository
và máy kháchTesterClient
được giả lập bằng cách sử dụng framework đối tượng giả lập, chẳng hạn như Moq. Một đối tượng giả lập là một đối tượng được chế tạo với một tập hợp các property và hành vi phương thức được xác định trước được sử dụng để thử nghiệm. Để biết thêm thông tin, hãy xem Kiểm tra tích hợp trong ASP.NET Core.
Để biết thêm thông tin về nội dung C# được Grpc.Tools tự động tạo, hãy xem các dịch vụ gRPC với C#: Nội dung C# được tạo.
Giả lập một máy khách gRPC
Máy khách gRPC là các loại máy khách cụ thể được tạo từ file .proto. Máy khách gRPC cụ thể có các phương thức chuyển sang dịch vụ gRPC trong file .proto
. Ví dụ: một dịch vụ được gọi Greeter
sẽ tạo ra một kiểu GreeterClient
có các phương thức để gọi dịch vụ.
Framework giả lập có thể mô phỏng kiểu máy khách gRPC. Khi một máy khách được mô phỏng được chuyển sang kiểu, thì quá trình thử nghiệm sẽ sử dụng phương thức được mô phỏng thay vì gửi lệnh gọi gRPC đến máy chủ.
[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"));
}
Thử nghiệm đơn vị trước:
- Giả lập
IGreetRepository
vàTesterClient
sử dụng Moq. - Bắt đầu worker.
- Xác minh
SaveGreeting
được gọi với message greeting được trả về bởiTesterClient
.
Tài nguyên bổ sung
- Kiểm thử dịch vụ gRPC với Postman hoặc gRPCurl trong ASP.NET Core
- Kiểm thử dịch vụ gRPC trong ASP.NET Core