ホーム>source

こんにちは私はhttpclientをモックしようとしています、明らかに私に必要な結果を与えるようにそれを強制しています。問題 つまり、私の単体テストでは、httpClientを2回モックする、それぞれに異なる応答があります。

<前>ウィズウィズ

これは私がこれをあざける:

<前>ウィズウィズ

これにより、デシリアライズして使用できる応答が返されます-id、name、およびstreetの3つのメンバーを持つオブジェクトを与えます。

ここで問題が発生します-同じ単体テストでも別のhttpclient-callがありますが、モックする方法がわかりません。こんなふうになります:

<前>ウィズウィズ

そして、最初に-それが唯一のhttpclient-callである場合、私は次のように模擬します。

<前>ウィズウィズ

しかし、明らかにできません...問題は、モックする必要のある複数のhttpclient-callsがあるこの状況を一度も試したことがないということです。ご覧のとおり、これらは異なるオブジェクトであり、そのように処理する必要があるため、異なるコンテンツで応答します。

誰もがこれを修正する方法を知っていますか?

... ... var httpReq = new HttpRequestMessage( HttpMethod.Get, $"{config["MY_TEST_ENDPOINT"]/site1}"); var myContent = await response.Content.ReadAsStringAsync(); var myFirstModel = JsonConvert.DeserializeObject<MyFirstModel>(myContent ); ... ...
あなたの答え
  • 解決した方法 # 1

    モックを設定することが常に最善の方法であるとは限りません。 HttpClient 以来  本当に HttpMessageHandler に依存します  期待されるリクエストを処理するシンプルなものを作成できます

    <前>ウィズウィズ

    上記のハンドラーは、着信要求のURLを使用して、ディクショナリーで応答を検索します。必要に応じて、より複雑なリクエストを処理するようにリファクタリングできますが、単純なリクエストの場合はこれで十分です。

    テスト用に作成されたクライアントにハンドラーを渡す

    <前>ウィズウィズ

    これで、テスト対象の期待される動作を検証するときに、必要に応じてカスタムハンドラーを備えたクライアントを呼び出すことができます。

    class TestMessageHandler : HttpMessageHandler { private readonly IDictionary<string, HttpResponseMessage> messages; public TestMessageHandler(IDictionary<string, HttpResponseMessage> messages) { this.messages = messages; } protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = messages[request.RequestUri.ToString()] ?? new HttpResponseMessage(HttpStatusCode.NotFound); response.RequestMessage = request; return Task.FromResult(response); } }

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ javascript - 角度出力デコレータが機能せず、エラーが発生します