【发布时间】:2012-02-16 00:39:10
【问题描述】:
我遇到了一场完美风暴,让我无法测试课程。该类是一个RestClient,它包装了一个内部HttpClient(我无法修改)。 HttpClient 上的 ExecuteMethod 方法无效。它接受IHttpMethod,并根据来自服务器的响应修改此对象。我想模拟出ExecuteMethod,以便它为我修改IHttpMethod。我正在尝试使用Callback 来实现这一点,但它不起作用。
这是发送请求的代码:
var httpClient = this.httpClientFactory.CreateHttpClient();
httpClient.ExecuteMethod(method);
var response = this.GetResourceResponse<T>(method.ResponseBodyAsStream.AsString());
response.ResponseHeaders = method.ResponseHeaders;
response.Status = method.StatusCode.ToString();
response.StatusCode = (int)method.StatusCode;
return response;
这是我的嘲笑尝试:
var mockHttpMethod = new Mock<IHttpMethod>();
mockHttpMethod.Setup(m => m.ResponseBodyAsStream).Returns(new MemoryStream(Encoding.UTF8.GetBytes("foo")));
var modifyHttpMethod = new Action<IHttpMethod>(m =>
{
m = mockHttpMethod.Object;
});
var mockHttpClient = new Mock<IHttpClient>();
mockHttpClient.Setup(c => c.ExecuteMethod(It.IsAny<IHttpMethod>()))
.Callback<IHttpMethod>(modifyHttpMethod);
var mockHttpClientFactory = new Mock<ILegalHoldHttpClientFactory>();
mockHttpClientFactory.Setup(f => f.CreateHttpClient()).Returns(mockHttpClient.Object);
var restClient = new RestClient(mockHttpClientFactory.Object);
当modifyHttpMethod 动作被执行时,我观察到两件事,这两件事都是我所期望的:
- 传入的
IHttpMethod(m) 具有我期望它具有的属性。 - 将模拟对象分配给
m后,它包含我在测试中设置的存根值。
但是,在执行回调并将控制权返回给我的应用程序代码后,我的 method 变量仍然具有我在上面第 1 步中看到的旧值,这会在尝试读取 method.ResponseBodyAsStream 时导致空引用异常.
我正在尝试做的事情甚至可以实现吗?如果是这样,怎么做?谢谢!
【问题讨论】: