测试定制AuthorizationAttribute时的NullReferenceException抛出 [英] NullReferenceException thrown when testing custom AuthorizationAttribute
问题描述
我在拍摄一看:
- How做我做一个单元测试来测试检查请求头的方法?
- 如何用最小起订量 李嘲笑Controller.User >
- How我单位测试应用了[授权]属性的控制器方法?
我想测试我写了一个自定义的AuthorizeAttribute。
我已经尝试了许多不同的事情来得到它的工作。这是我目前的尝试。
[AttributeUsage(AttributeTargets.All,的AllowMultiple = FALSE,继承= TRUE)]
公共类ConfigurableAuthorizeAttribute:AuthorizeAttribute
{
私人记录器记录=新的记录器(System.Reflection.MethodBase.GetCurrentMethod()DeclaringType);
私人IRoleHelper roleHelper; 公共ConfigurableAuthorizeAttribute()
{
roleHelper =新ADRoleHelper();
} 公共ConfigurableAuthorizeAttribute(IRoleHelper roleHelper)
{
this.roleHelper = roleHelper;
} 保护覆盖布尔AuthorizeCore(HttpContextBase的HttpContext)
{
如果(!httpContext.User.Identity.IsAuthenticated)
{
返回false;
} 如果(this.roleHelper.IsUserInRole(this.Roles,HttpContext.Current.User.Identity.Name))
{
返回true;
} 返回false;
} 保护覆盖无效HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
filterContext.Result =新RedirectResult(〜/家/未经授权);
}
}
[测试]
公共无效unauthenticated_user_not_allowed_to_access_resource()
{
VAR用户=新的模拟<&的IPrincipal GT;();
user.Setup(U => u.Identity.IsAuthenticated).Returns(假); VAR authContext =新的模拟< AuthorizationContext>();
authContext.Setup(AC => ac.HttpContext.User).Returns(user.Object); VAR configAtt =新ConfigurableAuthorizeAttribute();
configAtt.OnAuthorization(authContext.Object); authContext.Verify(AC => ac.Result == It.Is< RedirectResult>(R = GT; r.Url ==));
}
不管我做什么,我总是得到一个System.NullReferenceException当我运行测试。它似乎永远不会让过去的OnAuthorization电话。堆栈跟踪如下:
结果消息:System.NullReferenceException:对象引用未
设置为一个对象的一个实例。结果堆栈跟踪:在
System.Web.Mvc.OutputCacheAttribute.GetChildActionFilterFinishCallback(ControllerContext
controllerContext)在
System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext
filterContext)在
... ConfigurableAuthorizeAttributeTests.unauthenticated_user_not_allowed_to_access_resource()
在... ConfigurableAuthorizeAttributeTests.cs:行
29
块引用>没有任何人有关于如何解决这个问题?任何想法
修改
我找到了解决办法。我还需要嘲笑ControllerDescriptor并确保HttpContextBase.Items返回一个新的字典。
工作code:
VAR背景=新的模拟< HttpContextBase>();
context.Setup(C => c.Items).Returns(新词典&下;对象时,对象>());
context.Setup(C => c.User.Identity.IsAuthenticated).Returns(假);
VAR控制器=新的模拟< ControllerBase>();VAR actionDescriptor =新的模拟< ActionDescriptor>();
actionDescriptor.Setup(A => a.ActionName).Returns(「指数」);
VAR controllerDescriptor =新的模拟< ControllerDescriptor>();
actionDescriptor.Setup(一个= GT; a.ControllerDescriptor).Returns(controllerDescriptor.Object);VAR controllerContext =新的ControllerContext(context.Object,新的RouteData(),controller.Object);
VAR filterContext =新AuthorizationContext(controllerContext,actionDescriptor.Object);
VAR ATT =新ConfigurableAuthorizeAttribute();att.OnAuthorization(filterContext);Assert.That(filterContext.Result,Is.InstanceOf&所述; RedirectResult>());
Assert.That(((RedirectResult)filterContext.Result)的.url,Is.EqualTo(〜/家/未经授权));
解决方案我找到了解决办法。我还需要嘲笑ControllerDescriptor并确保HttpContextBase.Items返回一个新的字典。
工作code:
VAR背景=新的模拟< HttpContextBase>();
context.Setup(C => c.Items).Returns(新词典&下;对象时,对象>());
context.Setup(C => c.User.Identity.IsAuthenticated).Returns(假);
VAR控制器=新的模拟< ControllerBase>();VAR actionDescriptor =新的模拟< ActionDescriptor>();
actionDescriptor.Setup(A => a.ActionName).Returns(「指数」);
VAR controllerDescriptor =新的模拟< ControllerDescriptor>();
actionDescriptor.Setup(一个= GT; a.ControllerDescriptor).Returns(controllerDescriptor.Object);VAR controllerContext =新的ControllerContext(context.Object,新的RouteData(),controller.Object);
VAR filterContext =新AuthorizationContext(controllerContext,actionDescriptor.Object);
VAR ATT =新ConfigurableAuthorizeAttribute();att.OnAuthorization(filterContext);Assert.That(filterContext.Result,Is.InstanceOf&所述; RedirectResult>());
Assert.That(((RedirectResult)filterContext.Result)的.url,Is.EqualTo(〜/家/未经授权));I have taken a look at:
- How do I make a unit test to test a method that checks request headers?
- How to mock Controller.User using moq
- How do I unit test a controller method that has the [Authorize] attribute applied?
I am trying to test a custom AuthorizeAttribute that I wrote.
I have tried many different things to get it to work. This is my current attempt.
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] public class ConfigurableAuthorizeAttribute : AuthorizeAttribute { private Logger log = new Logger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private IRoleHelper roleHelper; public ConfigurableAuthorizeAttribute() { roleHelper = new ADRoleHelper(); } public ConfigurableAuthorizeAttribute(IRoleHelper roleHelper) { this.roleHelper = roleHelper; } protected override bool AuthorizeCore(HttpContextBase httpContext) { if (!httpContext.User.Identity.IsAuthenticated) { return false; } if (this.roleHelper.IsUserInRole(this.Roles, HttpContext.Current.User.Identity.Name)) { return true; } return false; } protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { base.HandleUnauthorizedRequest(filterContext); filterContext.Result = new RedirectResult("~/home/Unauthorized"); } }
[Test] public void unauthenticated_user_not_allowed_to_access_resource() { var user = new Mock<IPrincipal>(); user.Setup(u => u.Identity.IsAuthenticated).Returns(false); var authContext = new Mock<AuthorizationContext>(); authContext.Setup(ac => ac.HttpContext.User).Returns(user.Object); var configAtt = new ConfigurableAuthorizeAttribute(); configAtt.OnAuthorization(authContext.Object); authContext.Verify(ac => ac.Result == It.Is<RedirectResult>(r => r.Url == "")); }
No matter what I do I always get a System.NullReferenceException when I run the test. It never seems to get past the OnAuthorization call. The stack trace is as follows:
Result Message: System.NullReferenceException : Object reference not set to an instance of an object. Result StackTrace: at System.Web.Mvc.OutputCacheAttribute.GetChildActionFilterFinishCallback(ControllerContext controllerContext) at System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) at ...ConfigurableAuthorizeAttributeTests.unauthenticated_user_not_allowed_to_access_resource() in ...ConfigurableAuthorizeAttributeTests.cs:line 29
Does anybody have any ideas on how to solve this problem?
Edit
I found the solution. I also needed to mock ControllerDescriptor and make sure that HttpContextBase.Items returned a new Dictionary.
Working code:
var context = new Mock<HttpContextBase>(); context.Setup(c => c.Items).Returns(new Dictionary<object, object>()); context.Setup(c => c.User.Identity.IsAuthenticated).Returns(false); var controller = new Mock<ControllerBase>(); var actionDescriptor = new Mock<ActionDescriptor>(); actionDescriptor.Setup(a => a.ActionName).Returns("Index"); var controllerDescriptor = new Mock<ControllerDescriptor>(); actionDescriptor.Setup(a => a.ControllerDescriptor).Returns(controllerDescriptor.Object); var controllerContext = new ControllerContext(context.Object, new RouteData(), controller.Object); var filterContext = new AuthorizationContext(controllerContext, actionDescriptor.Object); var att = new ConfigurableAuthorizeAttribute(); att.OnAuthorization(filterContext); Assert.That(filterContext.Result, Is.InstanceOf<RedirectResult>()); Assert.That(((RedirectResult)filterContext.Result).Url, Is.EqualTo("~/home/Unauthorized"));
解决方案I found the solution. I also needed to mock ControllerDescriptor and make sure that HttpContextBase.Items returned a new Dictionary.
Working code:
var context = new Mock<HttpContextBase>(); context.Setup(c => c.Items).Returns(new Dictionary<object, object>()); context.Setup(c => c.User.Identity.IsAuthenticated).Returns(false); var controller = new Mock<ControllerBase>(); var actionDescriptor = new Mock<ActionDescriptor>(); actionDescriptor.Setup(a => a.ActionName).Returns("Index"); var controllerDescriptor = new Mock<ControllerDescriptor>(); actionDescriptor.Setup(a => a.ControllerDescriptor).Returns(controllerDescriptor.Object); var controllerContext = new ControllerContext(context.Object, new RouteData(), controller.Object); var filterContext = new AuthorizationContext(controllerContext, actionDescriptor.Object); var att = new ConfigurableAuthorizeAttribute(); att.OnAuthorization(filterContext); Assert.That(filterContext.Result, Is.InstanceOf<RedirectResult>()); Assert.That(((RedirectResult)filterContext.Result).Url, Is.EqualTo("~/home/Unauthorized"));
这篇关于测试定制AuthorizationAttribute时的NullReferenceException抛出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!