28

HttpMessageRequestプロジェクトで新しい Web API ビットを使用していますが、要求にクライアント証明書を追加する必要があるため、通常の を使用できないことがわかりました。その結果、私は を使用していますHttpClient(したがって、 を使用できますWebRequestHandler)。これは、少なくともRhino Mocksの場合、スタブ/モックフレンドリーではないことを除いて、すべてうまく機能します。

私は通常、HttpClient代わりに使用するラッパー サービスを作成しますが、ラップする必要があるメソッドがたくさんあるため、可能であればこれを避けたいと考えています。スタブの方法について何か提案はありますHttpClientか?

4

3 に答える 3

39

数か月前にMockHttpという便利なライブラリをリリースしました。HttpMessageHandler流暢な (そして拡張可能な) API を備えたカスタムを使用します。モックされたハンドラー (または HttpClient) をサービス クラスに挿入すると、構成どおりに応答します。

以下に基本的な使い方を示します。およびメソッドには、カスタム ロジックの実行を含む一連のオーバーロードがありますWhenGitHub ページRespondのドキュメントには、さらに詳細が記載されています。

var mockHttp = new MockHttpMessageHandler();

// Setup a respond for the user api (including a wildcard in the URL)
mockHttp.When("http://localhost/api/user/*")
        .Respond("application/json", "{'name' : 'Test McGee'}"); // Respond with JSON

// Inject the handler or client into your application code
var client = new HttpClient(mockHttp);

var response = async client.GetAsync("http://localhost/api/user/1234");
// or without async: var response = client.GetAsync(...).Result;

var json = await response.Content.ReadAsStringAsync();

// No network connection required
Console.Write(json); // {'name' : 'Test McGee'}
于 2014-09-22T23:53:00.937 に答える
11

私は Moq を使用しており、HttpClient をスタブ化できます。これはRhino Mockでも同じだと思います(自分で試したことはありません)。HttpClient をスタブするだけの場合は、以下のコードが機能するはずです。

var stubHttpClient = new Mock<HttpClient>();
ValuesController controller = new ValuesController(stubHttpClient.Object);

私が間違っている場合は、私を修正してください。ここで言及しているのは、HttpClient 内のメンバーをスタブ化することだと思います。

最も一般的な分離/モック オブジェクト フレームワークでは、非仮想メンバーでのスタブ/セットアップは許可されません。たとえば、以下のコードは例外をスローします。

stubHttpClient.Setup(x => x.BaseAddress).Returns(new Uri("some_uri");

また、多くの HttpClient メンバーをラップするため、ラッパーの作成を避けたいとも述べました。多くのメソッドをラップする必要がある理由は明確ではありませんが、必要なメソッドだけを簡単にラップできます。

例えば ​​:

public interface IHttpClientWrapper  {   Uri BaseAddress { get;  }     }

public class HttpClientWrapper : IHttpClientWrapper
{
   readonly HttpClient client;

   public HttpClientWrapper()   {
       client = new HttpClient();
   }

   public Uri BaseAddress   {
       get
       {
           return client.BaseAddress;
       }
   }
}

あなたに役立つと思われる他のオプション (たくさんの例があるので、コードは書きません) Microsoft Moles Framework http://research.microsoft.com/en-us/projects/moles/ Microsoft Fakes: ( VS2012 Ultimate を使用している場合) http://msdn.microsoft.com/en-us/library/hh549175.aspx

于 2012-09-03T12:18:30.113 に答える