참고 항목
이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.
Important
이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.
현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.
작성자: James Newton-King
테스트는 안정적이고 유지 관리 가능한 소프트웨어를 구축하는 데 있어 중요한 측면입니다. 고품질 테스트 작성의 일환으로 외부 종속성을 제거하고 있습니다. 이 문서에서는 테스트에서 모의 gRPC 클라이언트를 사용하여 외부 서버에 대한 gRPC 호출을 제거하는 방법을 설명합니다.
테스트 가능한 클라이언트 앱 예제
클라이언트 앱 테스트를 시연하려면 샘플 앱에서 다음 형식을 검토합니다.
Worker
는 gRPC 서버를 호출하는 BackgroundService입니다.
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);
}
}
}
위의 형식은 다음과 같습니다.
- 명시적 종속성 원칙을 따릅니다.
TesterClient
는 빌드 프로세스 중에 test.proto 파일을 기반으로 하는 도구 패키지 Grpc.Tools에 의해 자동으로 생성됩니다.- DI(종속성 주입)에서
TesterClient
및IGreetRepository
인스턴스를 제공할 것으로 기대합니다. 앱은 gRPC 클라이언트 팩터리를 사용하여TesterClient
를 만들도록 구성됩니다. - Moq 같은 모의 개체 프레임워크를 사용하여 모의된
IGreetRepository
서비스 및TesterClient
클라이언트로 테스트할 수 있습니다. ‘모의 개체’는 테스트에 사용되는 사전 결정된 속성 및 메서드 동작 집합이 있는 제작된 개체입니다. 자세한 내용은 ASP.NET Core의 통합 테스트를 참조하세요.
Grpc.Tools에 의해 자동으로 생성된 C# 자산에 대한 자세한 내용은 C#을 사용하는 gRPC 서비스: 생성된 C# 자산을 참조하세요.
gRPC 클라이언트 모의
gRPC 클라이언트는 .proto
파일에서 생성되는 구체적인 클라이언트 형식입니다. 구체적인 gRPC 클라이언트에는 .proto
파일에서 gRPC 서비스로 변환되는 메서드가 있습니다. 예를 들어 Greeter
라는 서비스는 서비스를 호출하는 메서드를 사용하여 GreeterClient
형식을 생성합니다.
모의 프레임워크는 gRPC 클라이언트 형식을 모의할 수 있습니다. 모의된 클라이언트가 형식에 전달되면 테스트는 서버에 gRPC 호출을 보내는 대신 모의된 메서드를 사용합니다.
[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"));
}
위의 단위 테스트:
- Moq를 사용하여
IGreetRepository
및TesterClient
를 모의합니다. - 작업자를 시작합니다.
- 모의
TesterClient
메시지에서 반환된 인사말 메시지와 함께SaveGreeting
가 호출되는지 확인합니다.
추가 리소스
ASP.NET Core