다음을 통해 공유


테스트에서 gRPC 클라이언트 모의

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

Warning

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .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(종속성 주입)에서 TesterClientIGreetRepository 인스턴스를 제공할 것으로 기대합니다. 앱은 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를 사용하여 IGreetRepositoryTesterClient를 모의합니다.
  • 작업자를 시작합니다.
  • 모의 TesterClient 메시지에서 반환된 인사말 메시지와 함께 SaveGreeting가 호출되는지 확인합니다.

추가 리소스