4

我想对下面使用 HttpClient 的 Search 类进行单元测试,

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

有没有办法模拟 HttpClient?我无法通过 Google 找到任何信息。

更新

发送可以模拟的 Http Web 请求是否有替代方法。我有以下代码:

 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 框架中,您可以执行此操作。

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 这样的模拟框架来模拟它,因为为了做到这一点,你需要一个interfacevirtual methodsHttpClient类上。模拟框架将为您创建一个模拟,它要么实现接口上定义的方法,要么覆盖虚拟类的方法。

因此,要么包装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 回答