你好,我正在尝试模拟httpclient,以便强制它给我需要的结果。 问题在于 ,在我的单元测试中,我必须两次模拟httpClient,每次响应都不同。
...
...
var httpReq = new HttpRequestMessage(
HttpMethod.Get,
$"{config["MY_TEST_ENDPOINT"]/site1}");
var myContent = await response.Content.ReadAsStringAsync();
var myFirstModel = JsonConvert.DeserializeObject<MyFirstModel>(myContent );
...
...
我嘲笑这个可能性:
...
myMockedHttp
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("[{'id':'0001'," +
"'name':'Jonah'," +
"'street':'Cambridge Street 1234'}]"
)
})
.Verifiable();
这将给我一个响应,我可以进行反序列化并使用它,提供一个具有3个成员id、名称和街道的对象。
对我来说,问题在于同一单元测试中还有另一个httpclient调用,但我不知道如何模拟它。它是这样的:
...
...
var httpReq = new HttpRequestMessage(
HttpMethod.Get,
$"{config["MY_TEST_ENDPOINT"]/site2}");
var httpResponseMsg = await _httpClient.SendAsync(httpReq);
var myContent = await response.Content.ReadAsStringAsync();
var myFirstModel = JsonConvert.DeserializeObject<MySecondModel>(myContent );
...
...
如果它是唯一的httpclient调用,最初我会这样模拟它:
...
myMockedHttp
.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.IsAny<HttpRequestMessage>(),
ItExpr.IsAny<CancellationToken>())
.ReturnsAsync(new HttpResponseMessage()
{
StatusCode = HttpStatusCode.OK,
Content = new StringContent("[{'id':'34'," +
"'insurance':'Etx'," +
"'insider':'daily'," +
"'collectives':'4'}]"
)
})
.Verifiable();
...
...
但是很明显,我不能...问题是,我从未尝试过这种情况,即需要模拟多个httpclient调用。正如您所看到的,它们响应不同的内容,因为它们是不同的对象,需要以这种方式处理。
有人有什么办法解决这个问题吗?
ItExpr.IsAny<HttpRequestMessage>()
,它允许任何请求。相反,告诉模拟对象你想要模拟的确切请求以及该请求应该得到的响应。 - Heretic MonkeyIt.Is<HttpRequestMessage>((message) => message.RequestUri.Host.Contains("somesite1"))
的事情。 - Heretic Monkey