我在一个项目中使用新的Web API位,我发现我不能使用正常的HttpMessageRequest,因为我需要添加客户端证书到请求。因此,我使用HttpClient(所以我可以使用WebRequestHandler)。这一切都很好,除了它不是残桩/模拟友好,至少对于犀牛Mocks。
我通常会创建一个环绕HttpClient的包装服务,我会改用,但我想避免这种可能,因为有很多方法,我需要包装。我希望我有缺少的东西 – 任何建议如何存根HttpClient?
解决方法
我使用Moq,我可以stub出HttpClient。我认为这一点对于犀牛Mock(我没有试过自己)。
如果你只是想存根HttpClient下面的代码应该工作:
如果你只是想存根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