我可以在没有包装器的情况下模拟 httpClient.PostAsync() 调用吗?
Can I mock httpClient.PostAsync() call without a wrapper?
我正在使用 Moq 编写测试,并且能够为 GetAsync() 调用模拟 HttpClientHandler,但是当我尝试模拟 PostAsync() 时,它 returns 为空。有没有办法在不围绕整个 HttpClient 创建包装器的情况下模拟该功能?
下面是我模拟函数的单元测试代码。
Mock<WebProxy> mockWebProxy = new Mock<WebProxy>();
mockWebProxy.Object.Address = new Uri(configuration.GetSection("TestProxy").Value);
mockWebProxy.Object.UseDefaultCredentials = true;
Mock<HttpClient> mockHttpClient = new Mock<HttpClient>();
var mockHttpClientHandler = new Mock<HttpClientHandler>();
mockHttpClientHandler.Object.Proxy = mockWebProxy.Object;
mockHttpClientHandler
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>()
)
.ReturnsAsync(new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("this is a test")
})
.Verifiable();
mockHttpClient = new Mock<HttpClient>(mockHttpClientHandler.Object, true);
然后我调用 PostAsync():
var response = await httpClient.PostAsync(new Uri(url), stringContent);
PostAsync() 在不模拟 httpClient 时工作。但是在模拟时,上面的响应为空。这告诉我正在使用模拟的 HttpClient,因为没有响应,但我不确定为什么它为 null 而不是我模拟的 HttpResponseMessage,它适用于 GetAsync()。
您将需要一个包装器。
您的设置是针对 SendAsync
的,它在基 HttpMessageInvoker
class 中是虚拟的,因此可以覆盖,但您正在调用 PostAsync
,即 public 且不可覆盖。
HttpClient
很酷的一点是,一旦包装好就可以重复使用。硬着头皮(如果可以的话)把它包起来。 :-)
我正在使用 Moq 编写测试,并且能够为 GetAsync() 调用模拟 HttpClientHandler,但是当我尝试模拟 PostAsync() 时,它 returns 为空。有没有办法在不围绕整个 HttpClient 创建包装器的情况下模拟该功能?
下面是我模拟函数的单元测试代码。
Mock<WebProxy> mockWebProxy = new Mock<WebProxy>();
mockWebProxy.Object.Address = new Uri(configuration.GetSection("TestProxy").Value);
mockWebProxy.Object.UseDefaultCredentials = true;
Mock<HttpClient> mockHttpClient = new Mock<HttpClient>();
var mockHttpClientHandler = new Mock<HttpClientHandler>();
mockHttpClientHandler.Object.Proxy = mockWebProxy.Object;
mockHttpClientHandler
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>()
)
.ReturnsAsync(new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("this is a test")
})
.Verifiable();
mockHttpClient = new Mock<HttpClient>(mockHttpClientHandler.Object, true);
然后我调用 PostAsync():
var response = await httpClient.PostAsync(new Uri(url), stringContent);
PostAsync() 在不模拟 httpClient 时工作。但是在模拟时,上面的响应为空。这告诉我正在使用模拟的 HttpClient,因为没有响应,但我不确定为什么它为 null 而不是我模拟的 HttpResponseMessage,它适用于 GetAsync()。
您将需要一个包装器。
您的设置是针对 SendAsync
的,它在基 HttpMessageInvoker
class 中是虚拟的,因此可以覆盖,但您正在调用 PostAsync
,即 public 且不可覆盖。
HttpClient
很酷的一点是,一旦包装好就可以重复使用。硬着头皮(如果可以的话)把它包起来。 :-)