asp.net - 调用 PostAsync 后测试 HttpRequestMessage.Content 的值

标签 asp.net .net asp.net-core httpclient .net-core

我们已经模拟了 HttpMessageHandler,因此我们可以测试使用 HttpClient 的类。

我们正在测试的方法之一创建一个新的 HttpClient,调用 PostAsync,并处置 HttpClient。我们想测试 HTTP 请求的 Content,如下所示:

Assert.Equal("", ActualHttpRequestMessage.Content.ReadAsStringAsync());

问题是我们“无法访问已处置的对象”,因为 the HttpClient disposes the Content

问题我们如何检查内容?

这是我们的起订量设置。

MockHttpMessageHandler = new Mock<HttpMessageHandler>();

MockHttpMessageHandler
    .Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync",
        ItExpr.IsAny<HttpRequestMessage>(),
        ItExpr.IsAny<CancellationToken>())
    .Callback<HttpRequestMessage, CancellationToken>(
        (httpRequestMessage, cancellationToken) =>
        {
            ActualHttpRequestMessage = httpRequestMessage;
        })
    .Returns(
        Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(string.Empty)
        }));

这就是我们在测试类中使用它的方式。

new HttpClient(HttpMessageHandler);

最佳答案

将你的模拟更改为:

MockHttpMessageHandler
    .Protected()
    .Setup<Task<HttpResponseMessage>>(
        "SendAsync",
        ItExpr.IsAny<HttpRequestMessage>(),
        ItExpr.IsAny<CancellationToken>())
    .Callback<HttpRequestMessage, CancellationToken>(
        (httpRequestMessage, cancellationToken) =>
        {
            // +++++++++++++++++++++++++++++++++++++++++
            // Read the Content here before it's disposed
            ActualHttpRequestContent = httpRequestMessage.Content
                .ReadAsStringAsync()
                .GetAwaiter()
                .GetResult();

            ActualHttpRequestMessage = httpRequestMessage;
        })
    .Returns(
        Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(string.Empty)
        }));

然后你可以这样测试:

Assert.Equal("", ActualHttpRequestContent);

请记住,我们只能读取 Content 一次,因此如果您稍后尝试读取它,它将是空的。它就像一个海森堡物体。

关于asp.net - 调用 PostAsync 后测试 HttpRequestMessage.Content 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732597/

相关文章:

asp.net - 从 URL 获取图像并上传到 Amazon S3

c# - 如何使用 string.contains 查找分隔/隔离的子字符串?

c# - VS2017 中的 ASP.Net Core : Setting up React. js + webpack + babel

c# - ASP.Net 复选框确认消息不起作用

c# - 拒绝 HTTP 动词的 MVC3 自定义属性

c# - 模型绑定(bind)的复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数

.net - WPF - 绑定(bind)到菜单图标

.net - Entity Framework ,将oracle数据库类型号(10)映射到.net Int32

c# - 是否可以直接路由到托管在 MVC 应用程序中的 blazor 页面?

asp.net-core - 使用 .NetFramework 而不是项目目标框架来恢复包