如何阅读 DefaultHttpContext 的主体?

How can I read the Body of the DefaultHttpContext?

我正在编写一个在调用中使用 DefaultHttpContext 的测试(startup 是这里的测试对象):

[Fact]
public async void HandleCabinet_ShouldReturnValidCabinetSettings()
{
    var startup = new Startup();
    var context = DefaultHttpConext();

    await startup.HandleCabinet(context);

    string body;
    using (var reader = new StreamReader(context.Response.Body, Encoding.UTF8))
    {
        body = reader.ReadToEnd();
    }

    Assert.Equal("some expectation", body);
}

问题是,body 始终是一个空字符串。在 HandleCabinet 方法中,我这样写:

await context.Response.WriteAsync("some expectation");

我看到默认情况下,Body 是一个 NullStream,所以我尝试像这样设置流:

context.Response.Body = new BufferedStream(new MemoryStream());

但是,那没有效果。

那么,我如何构造 DefaultHttpContext,以便我可以测试响应?

您可以使用 MemoryStream 并将位置重置为 0。

例如

正在创建 DefaultHttpContext

private DefaultHttpContext CreateHttpContext()
{
    var context = new DefaultHttpContext
    {
        Response =
        {
            Body = new MemoryStream()
        }
    };
    return context;
}

正文到字符串:(注意:C# 9 语法)

public static string StreamToString(Stream stream)
{
    stream.Position = 0;
    using StreamReader reader = new(stream, Encoding.UTF8);
    return reader.ReadToEnd();
}

断言:

var body = StreamToString(context.Response.Body);
Assert.Equal("some expectation", body);

我用来创建 DefaultHttpContext

的设置