events
テストで gRPC クライアントをモックする
注意
これは、この記事の最新バージョンではありません。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
警告
このバージョンの ASP.NET Core はサポート対象から除外されました。 詳細については、 .NET および .NET Core サポート ポリシーを参照してください。 現在のリリースについては、この記事の .NET 9 バージョンを参照してください。
重要
この情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 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
は、ビルド プロセス中に、ツール パッケージ Grpc.Tools によって、test.proto ファイルに基づいて自動的に生成されます。- 依存関係の挿入 (DI) で
TesterClient
とIGreetRepository
のインスタンスを提供する必要があります。 このアプリは、gRPC クライアント ファクトリを使用してTesterClient
を作成するように構成されています。 - モック オブジェクト フレームワーク (Moq など) を使用してモックされた
IGreetRepository
サービスとTesterClient
クライアントでテストできます。 モック オブジェクトは、テストで使用されるプロパティとメソッドの動作が事前定義されている加工オブジェクトです。 詳細については、「ASP.NET Core での統合テスト」を参照してください。
Grpc.Tools によって自動的に生成される C# アセットの詳細については、「C# を使用した gRPC サービス」の「生成された C# アセット」を参照してください。
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
をモックします。 - worker を開始します。
- モックされた
TesterClient
が返すあいさつメッセージを使ってSaveGreeting
が呼び出されることを確認します。
ASP.NET Core に関するフィードバック
ASP.NET Core はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。