繁体   English   中英

我可以在没有包装的情况下模拟httpClient.PostAsync()调用吗?

[英]Can I mock httpClient.PostAsync() call without a wrapper?

我使用Moq编写测试,并且能够模拟HttpClientHandler进行GetAsync()调用,但是当我尝试模拟PostAsync()时,它将返回null。 有没有一种方法可以模拟该功能,而无需在整个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);

不模拟httpClient时,PostAsync()起作用。 但是,在进行模拟时,上面的响应为null。 这告诉我正在使用模拟的HttpClient,因为没有响应,但是我不确定为什么它为null,而不是我模拟的不适用于GetAsync()的HttpResponseMessage。

您将需要一个包装器。

您的设置是针对SendAsync ,该类在HttpMessageInvoker基类中是虚拟的,因此可以重写,但是您正在调用PostAsync ,它是公共的且不能重写。

关于HttpClient事情是,一旦包装它就可以重用。 伸出一口子弹(如果可以的话)并将其包裹起来。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM