4

HttpClientを使用する以下のSearchクラスの単体テストが必要です。

public class Search:ISearch{
HttpClient httpClient;
  public Search(HttpClient httpClient){
   this.httpClient = httpClient;
}
   //use httClient to send request.
}

HttpClientをモックする方法はありますか?Googleで情報が見つかりません。

アップデート

モックできるHttpWebリクエストを送信する代わりの方法はありますか。私は以下のコードを持っています:

 public class Search:ISearch{
private static readonly string url = "http://www.google.com/search";
public Result SendSearch(string query){
           string queryUrl = string.Format("{0}?q={1}", url, query);
           var webRequest = WebRequest.Create(queryUrl);
          ///...
}
4

2 に答える 2

3

.Net 4.5 Frameworkでは、これを行うことができます。

public class FakeHttpMessageHandler : HttpMessageHandler
{
    private HttpResponseMessage response;

    public FakeHttpMessageHandler(HttpResponseMessage response)
    {
        this.response = response;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var responseTask =  new TaskCompletionSource<HttpResponseMessage>();
        responseTask.SetResult(response);

        return responseTask.Task;
    }
}


[TestMethod]
public void TestGetContents()
{
    var responseMessage = new HttpResponseMessage();
    var messageHandler = new FakeHttpMessageHandler(responseMessage);
    var client = new HttpClient(messageHandler);
    var sut = new Search(client);

    sut.SendSearch("urQuery");

    // Asserts
}
于 2015-05-19T09:07:41.380 に答える
2

Rhino-Mocksのようなモックフレームワークでモックすることはできません。そのためには、interfaceまたはクラスvirtual methodsのいずれかが必要だからです。HttpClientモックフレームワークは、インターフェイスで定義されたメソッドを実装するか、仮想クラスのメソッドをオーバーライドするモックを作成します。

したがって、HttpClientクラスをラップしてインターフェイスを実装させるか、モックしないでください。

コードを次のようなものに変更する場合:

public class Search:ISearch
{
    private static readonly string url = "http://www.google.com/search";
    private readonly IWebRequestCreator _generator;

    public Search(IWebRequestCreator generator)
    {
        _generator = generator;
    }

    public Result SendSearch(string query)
    {
        var queryUrl = string.Format("{0}?q={1}", url, query);
        var webRequest = _generator.Create(queryUrl);
        // ...
    }
}

を実装するクラスを作成するとIWebRequestCreator、機能をモックすることができます。実装クラスはただ呼び出すでしょうWebRequest.Create(queryUrl);

于 2013-03-10T19:20:21.827 に答える