【发布时间】:2022-01-11 02:57:53
【问题描述】:
我使用以下代码模拟HttpClient 的SendAsync 方法:
var mock = new Mock<HttpMessageHandler>();
Parallel.ForEach(endpoints, (e) =>
{
mock
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.Is<HttpRequestMessage>(
x => x.RequestUri.AbsolutePath.Contains(e.Endpoint)),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(() => new HttpResponseMessage()
{
Content = e.Response
});
});
var client = new HttpClient(mock.Object);
其中endpoints 是以下类型的对象列表:
class Parameters
{
public string Endpoint { get; }
private readonly string _response;
public StringContent Response
{
get { return new StringContent(_response); }
}
}
这种模拟方法按预期工作,但有一个警告。在添加了相当数量的端点后,模拟受保护端点的速度显着下降。我需要为 ~5000 个端点模拟客户端,每个端点有 ~2MB 响应。 (为更少的端点和更小的数据设计测试似乎很棒,但不幸的是,在我的用例中不是一个选项)。增加了约 2k 个端点后,模拟速度显着下降。运行约 2 小时后,无法到达约 3k 端点。
我想知道是否有替代/更好的方法来模拟 HttpClient,理想情况下是线性渐近行为。
【问题讨论】:
-
所有 2MB 响应是否相同?您是否重用用于
_response的字符串?您是否确保它在处理程序部分很慢,而不是在字符串生成部分? -
Response需要在对端点的每个 API 请求中成为基于_response的新实例,因此_response被重用于对端点的不同调用。我还没有完成 CPU 分析,因此无法确定它在处理程序或字符串生成时是否变得越来越慢。
标签: c# unit-testing mocking httpclient moq