2013-03-10 49 views
4

我都想单元测试低于搜索类使用HttpClient的,单元测试使用类的HttpClient在System.Net.Http V4

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

有没有办法来嘲笑HttpClient的?我无法通过Google找到任何信息。

更新

是否有alternaitve来发送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); 
      ///... 
} 
+0

嗯,你真的想嘲笑框架的一部分吗?我不明白这会给你带来什么,但也许我只是想念你的观点。 – 2013-03-10 18:54:42

回答

2

你不能像犀牛,嘲弄嘲弄框架嘲笑它,因为为了做到这一点,你需要或者一个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);

+0

请参阅我的更新。 – Pingpong 2013-03-10 20:01:22

+1

是的,包装它:)。不知道你的搜索调用者是如何定义的,但也许你可以从这篇文章中窃取一些想法:http://stackoverflow.com/questions/9823039/is-it-possible-to-mock-out-a-net -httpwebresponse – bas 2013-03-10 20:05:58

+0

@Pingpong根据你的问题更新提出了更新 – bas 2013-03-10 20:12:54

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 
}