如何读取DefaultHttpContext的响应Body并完成对应单元测试?
问题核心原因
DefaultHttpContext默认的Response.Body是NullStream,所有写入操作都会被静默丢弃,必须替换为可读写的内存流- 调用
WriteAsync写入内容后,流的指针会停留在写入内容的末尾,直接读取会从末尾开始读,拿到空结果,需要手动将指针重置到起始位置
修正后的测试代码
[Fact] public async void HandleCabinet_ShouldReturnValidCabinetSettings() { var startup = new Startup(); var context = new DefaultHttpContext(); // 修正原代码拼写错误:DefaultHttpConext -> DefaultHttpContext // 替换响应流为可读写的MemoryStream context.Response.Body = new MemoryStream(); await startup.HandleCabinet(context); // 重置流指针到起始位置,才能正常读取写入的内容 context.Response.Body.Position = 0; string body; using (var reader = new StreamReader(context.Response.Body, Encoding.UTF8)) { body = reader.ReadToEnd(); } Assert.Equal("some expectation", body); }
补充说明
如果需要使用BufferedStream也可以正常生效,只需要保证读取前重置流位置即可,和直接使用MemoryStream没有本质区别。
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

