13

誰か助けてくれませんか。独自の IHttpClient を作成したので、moq を使用して HttpClient をモックできます。かなりうまく機能しますが、Authorization というプロパティを持つ DetaultRequestHeaders という内部オブジェクトがあります。

もちろん、実行時にすべてが期待どおりに機能します。しかし、単体テストを使用すると、次のエラーが表示されます

    Object reference not set to instance....

これは、DefaultRequestHeaders が null であるためです。

これをさらに調査した後、タイプのようです

    HttpRequestHeaders

しかし、それは封印されたクラスなので、これを行うことさえできません

    .Setup(x => x.DefaultRequestHeaders).Returns(return new HttpRequestHeaders())

誰もこれについて経験がありますか?

これはインターフェース定義です

    HttpRequestHeaders DefaultRequestHeaders { get; }

前もって感謝します

4

3 に答える 3

16

具体的な HttpClient を注入し、基になる HttpMessageHandler をモックするだけです...

http://geekswithblogs.net/abhi/archive/2013/11/20/unit-tests-for-httpclient-using-httpmessagehandler.aspx

HttpClient にモック HttpMessageHandler を与えることで、HttpClient を使用するクラスを単体テストできます。このようにして、リクエストをキャプチャし、実際にネットワークを通過するのを防ぐことができます。

Moq を使用した例を次に示します。HttpClient は HttpMessageHandler の SendAsync() メソッドに依存するため、SendAsync() にスタブ実装を与え、Moq の Callback() を使用して引数をキャプチャします。

var handler = new Mock<HttpMessageHandler>();

handler.Protected()

    .Setup<Task<HttpResponseMessage>>("SendAsync", ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())

    .Returns(Task<HttpResponseMessage>.Factory.StartNew(() =>

    {

        return new HttpResponseMessage(HttpStatusCode.OK);

    }))

    .Callback<HttpRequestMessage, CancellationToken>((r, c) =>

    {

        Assert.AreEqual(HttpMethod.Get, r.Method);

    });

 

using (var client = new HttpClient(handler.Object))

{

    var request = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com");

    var response = client.SendAsync(request).Result;

    Console.WriteLine(response.StatusCode);

}
于 2014-01-15T13:59:30.417 に答える