[嗨,我正在尝试模拟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调用。如您所见,由于它们是不同的对象并且需要以这种方式进行处理,因此它们以不同的内容进行响应。
有人知道如何解决此问题吗?
UPDATE 1:
(从评论中尝试解决方案)[尝试了来自Heretic Monkey的建议解决方案(因为它似乎是最先尝试的最简单的实现,但在涉及到时却失败了
var httpClient = new HttpClient(myMockedHttp.Object) { BaseAddress = new Uri($"{config["MY_TEST_ENDPOINT"]}") };
我收到以下错误:
System.InvalidOperationException:无效的请求URI是提供。请求URI必须是绝对URI或必须设置BaseAddress。
[嗨,我正在尝试模拟httpclient,显然是强迫它给我我需要的结果。问题是,在我的单元测试中,我不得不模拟httpClient两次,每次响应都不同。 ... ...
有时设置模拟可能并不总是最好的方法。由于HttpClient
确实取决于HttpMessageHandler
,因此您可以创建一个简单的文件来处理预期的请求