Unit testing 初始化DefaultHttpContext.Response.Body到MemoryStream会抛出NullReferencePointer

Unit testing 初始化DefaultHttpContext.Response.Body到MemoryStream会抛出NullReferencePointer,unit-testing,.net-core,middleware,httpcontext,exceptionhandler,Unit Testing,.net Core,Middleware,Httpcontext,Exceptionhandler,我正在研究全局异常中间件的实现,我想用单元测试来介绍中间件。下面你看我走了多远 这是一个单元测试代码 [事实] 公共异步任务方法名称\u StateUnderTest\u ExpectedBehavior() { //安排 IEExceptionHandlerFeature exceptionHandlerFeature=new exceptionHandlerFeature{Error=new NotFoundException()}; IFeatureCollection features=

我正在研究全局异常中间件的实现,我想用单元测试来介绍中间件。下面你看我走了多远

这是一个单元测试代码

[事实]
公共异步任务方法名称\u StateUnderTest\u ExpectedBehavior()
{
//安排
IEExceptionHandlerFeature exceptionHandlerFeature=new exceptionHandlerFeature{Error=new NotFoundException()};
IFeatureCollection features=新FeatureCollection();
功能。设置(例外HandlerFeature);
var context=新的DefaultHttpContext(功能);
context.Response.Body=newmemoryStream();
//表演
Wait ExceptionMiddleware.HandleException(上下文);
//断言
context.Response.StatusCode.Should().Be((int)HttpStatusCode.NotFound);
}
这是ExceptionMiddleware.Handle方法的代码

公共静态异步任务HandleException(HttpContext上下文) { var contextFeature=context.Features.Get(); if(contextFeature==null) { 返回; } if(contextFeature.Error为AppValidationException validationException) { context.Response.StatusCode=(int)HttpStatusCode.BadRequest; var failures=JsonConvert.SerializeObject(validationException.failures); 等待context.Response.WriteAsync( 新错误详细信息 { StatusCode=context.Response.StatusCode, Message=contextFeature.Error.Message, StackTrace=contextFeature.Error.StackTrace, 细节=失败 }.ToString()); 返回; } context.Response.StatusCode=(int)ResolveStatusCodeFromExceptionType(contextFeature.Error); context.Response.ContentType=“应用程序/json”; 等待context.Response.WriteAsync( 新错误详细信息 { StatusCode=context.Response.StatusCode, Message=contextFeature.Error.Message, StackTrace=contextFeature.Error.StackTrace }.ToString()); } 测试正在进行中

context.Response.Body=newmemoryStream();
根据这一点,一切都应该是好的,但我仍然不能初始化属性体

测试项目的目标框架是.NETCore3.0。 ExceptionMiddleware.cs位于具有set-target framework.NET标准2.1的项目中,它是类库

异常的堆栈跟踪非常短:

在 Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_Body(流 价值)在 Itixis.Shared.API.Tests.ExceptionMiddlewareTests.d_u0.MoveNext() 在里面 C:\Users\daniel.rusnok\source\repos\Itixis\Itixis.Shared\Tests\Itixis.Shared.API.Tests\ExceptionMiddlewareTests.cs:line 三十五


通过手动设置功能,您将删除默认设置的功能,这将导致空错误

public DefaultHttpContext()
:此(新功能集合())
{
Set(新的HttpRequestFeature());
Set(新的HttpResponseFeature());
Features.Set(新的StreamResponseBodyFeature(Stream.Null));
}
公共默认HttpContext(IFeatureCollection功能)
{
_特征。初始化(特征);
_请求=新的DefaultHttpRequest(此);
_响应=新的DefaultHttpResponse(此);
}

注意默认构造函数中添加的请求、响应和响应主体特性

或者尝试通过添加所需的功能来重新创建默认构造函数中完成的操作

IEExceptionHandlerFeature exceptionHandlerFeature=new exceptionHandlerFeature{Error=new NotFoundException()};
IFeatureCollection features=新FeatureCollection();
功能。设置(例外HandlerFeature);
Set(新的HttpRequestFeature());
Set(新的HttpResponseFeature());
features.Set(新的StreamResponseBodyFeature(Stream.Null));
var context=新的DefaultHttpContext(功能);
//...
或者删除手动功能并使用默认构造函数

[事实]
公共异步任务方法名称\u StateUnderTest\u ExpectedBehavior(){
//安排
var context=新的DefaultHttpContext();
context.Response.Body=newmemoryStream();
//表演
Wait ExceptionMiddleware.HandleException(上下文);
//断言
context.Response.StatusCode.Should().Be((int)HttpStatusCode.NotFound);
}

而且它应该能按预期工作。

调试时您是否已仔细阅读了代码?也可以在不设置任何功能的情况下进行尝试,看看会发生什么AAAA。。好吧。。有一只虫子。。功能正在发挥作用。非常感谢。