C#学习教程:测试自定义AuthorizationAttribute时抛出NullReferenceException我尝试了很多不同的方法来让它工作。这是我目前的尝试。[AttributeUsage(AttributeTargets.All,AllowMultiple=false,Inherited=true)]publicclassConfigurableAuthorizeAttribute:AuthorizeAttribute{privateLoggerlog=newLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);私有IRoleHelperroleHelper;publicConfigurableAuthorizeAttribute(){roleHelper=newADRoleHelper();}publicConfigurableAuthorizeAttribute(IRoleHelperroleHelper){this.roleHelper=roleHelper;}protectedoverrideboolAuthorizeCore(HttpContextBasehttpContext){if(!httpContext.User.Identity.IsAuthenticated){返回false;}if(this.roleHelper.IsUserInRole(this.Roles,HttpContext.Current.User.Identity.Name)){返回true;}返回假;}protectedoverridevoidHandleUnauthorizedRequest(AuthorizationContextfilterContext){base.HandleUnauthorizedRequest(filterContext);filterContext.Result=newRedirectResult("~/home/Unauthorized");}}[测试]publicvoidunauthenticated_user_not_allowed_to_access_resource(){varuser=newMock();user.Setup(u=>u.Identity.IsAuthenticated).Returns(false);varauthContext=newMock();authContext.Setup(ac=>ac.HttpContext.User).Returns(user.Object);varconfigAtt=newConfigurableAuthorizeAttribute();configAtt.OnAuthorization(authContext.Object);authContext.Verify(ac=>ac.Result==It.Is(r=>r.Url==""));无论我做什么,我在运行测试时都会收到System.NullReferenceException,而且它似乎永远无法通过OnAuthorization调用。堆栈跟踪如下:结果消息:System.NullReferenceException:Objectreferencenotsettoaninstanceofanobject.结果StackTrace:位于System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContextfilterContext)的System.Web.Mvc.OutputCacheAttribute.GetChildActionFilterFinishCallback(ControllerContextcontrollerContext)在...ConfigurableAuthorizeAttributeTests.unauthenticated_user_not_allowed_to_access_resource()在...ConfigurableAuthorizeAttributeTests.cs:第29行有人关于如何解决这个问题的任何想法?编辑我找到了解决方案。我还需要模拟ControllerDescriptor并确保HttpContextBase.Items返回一个新的字典。工作代码:varcontext=newMock();context.Setup(c=>c.Items).Returns(newDictionary());context.Setup(c=>c.User.Identity.IsAuthenticated).Returns(false);varcontroller=newMock();varactionDescriptor=newMock();actionDescriptor.Setup(a=>a.ActionName).Returns("Index");varcontrollerDescriptor=newMock();actionDescriptor.Setup(a=>a.ControllerDescriptor).Returns(controllerDescriptor.Object);varcontrollerContext=newControllerContext(context.Object,newRouteData(),controller.Object);varfilterContext=newAuthorizationContext(controllerContext,actionDescriptor.Object);varatt=newConfigurableAuthorizeAttribute();att.OnAuthorization(filterContext);Assert.That(filterContext.Result,Is.InstanceOf());Assert.That(((RedirectResult)filterContext.Result).Url,Is.EqualTo("~/home/Unauthorized"));我找到了解决方案。我还需要模拟ControllerDescriptor并确保HttpContextBase.Items返回一个新的Dictionary。工作代码:以上是C#学习教程:测试自定义AuthorizationAttribute时抛出NullReferenceException异常的所有内容分享,如果对大家有用,需要详细了解C#学习教程,希望大家多加关注—varcontext=newMock();context.Setup(c=>c.Items).Returns(newDictionary());context.Setup(c=>c.User.Identity.IsAuthenticated).Returns(false);varcontroller=newMock();varactionDescriptor=newMock();actionDescriptor.Setup(a=>a.ActionName).Returns("Index");varcontrollerDescriptor=newMock();actionDescriptor.Setup(a=>a.ControllerDescriptor).Returns(controllerDescriptor.Object);varcontrollerContext=newControllerContext(context.Object,newRouteData(),controller.Object);varfilterContext=newAuthorizationContext(controllerContext,actionDescriptor.Object);varatt=newConfigurableAuthorizeAttribute();att.OnAuthorization(filterContext);Assert.That(filterContext.Result,Is.InstanceOf());Assert.That(((RedirectResult)filterContext.Result).Url,Is.EqualTo("~/home/Unauthorized"));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
