在单个单元测试中多次模拟httpclient

问题描述 投票:0回答:1

[嗨,我正在尝试模拟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两次,每次响应都不同。 ... ...

c# unit-testing serialization moq dotnet-httpclient
1个回答
0
投票

有时设置模拟可能并不总是最好的方法。由于HttpClient确实取决于HttpMessageHandler,因此您可以创建一个简单的文件来处理预期的请求

© www.soinside.com 2019 - 2024. All rights reserved.