单元测试 – Stubbing或Mocking ASP.NET Web API HttpClient

我在一个项目中使用新的Web API位,我发现我不能使用正常的HttpMessageRequest,因为我需要添加客户端证书到请求。因此,我使用HttpClient(所以我可以使用WebRequestHandler)。这一切都很好,除了它不是残桩/模拟友好,至少对于犀牛Mocks。

我通常会创建一个环绕HttpClient的包装服务,我会改用,但我想避免这种可能,因为有很多方法,我需要包装。我希望我有缺少的东西 – 任何建议如何存根HttpClient?

解决方法

我使用Moq,我可以stub出HttpClient。我认为这一点对于犀牛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;
       }
   }
}

其他的选项,我认为可能会对你有好处(大量的例子,所以我不会写代码)
微软框架
http://research.microsoft.com/en-us/projects/moles/
微软假:(如果你使用VS2012终极)
http://msdn.microsoft.com/en-us/library/hh549175.aspx

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...