ASP.NET MVCunit testing自定义AuthorizeAttribute

我正在研究ASP.NET MVC 4项目(.NET框架4),我想知道如何正确地unit testing自定义AuthorizeAttribute(我使用NUnit和Moq)。

AuthorizeCore(HttpContextBase httpContext)了2个方法: AuthorizeCore(HttpContextBase httpContext)HandleUnauthorizedRequest(AuthorizationContext filterContext) 。 正如您所看到的,这些方法分别需要HttpContextBaseAuthorizationContext ,但我不知道如何模拟它们。

这是我得到的:

 [Test] public void HandleUnauthorizedRequest_UnexistingMaster_RedirectsToCommonNoMaster() { // Arrange var httpContext = new Mock(); var winIdentity = new Mock(); winIdentity.Setup(i => i.IsAuthenticated).Returns(() => true); winIdentity.Setup(i => i.Name).Returns(() => "WHEEEE"); httpContext.SetupGet(c => c.User).Returns(() => new ImdPrincipal(winIdentity.Object)); // This is my implementation of IIdentity var requestBase = new Mock(); var headers = new NameValueCollection { {"Special-Header-Name", "false"} }; requestBase.Setup(x => x.Headers).Returns(headers); requestBase.Setup(x => x.HttpMethod).Returns("GET"); requestBase.Setup(x => x.Url).Returns(new Uri("http://localhost/")); requestBase.Setup(x => x.RawUrl).Returns("~/Maintenance/UnExistingMaster"); requestBase.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(() => "~/Maintenance/UnExistingMaster"); requestBase.Setup(x => x.IsAuthenticated).Returns(() => true); httpContext.Setup(x => x.Request).Returns(requestBase.Object); var controller = new Mock(); var actionDescriptor = new Mock(); var controllerContext = new ControllerContext(httpContext.Object, new RouteData(), controller.Object); // Act var masterAttr = new ImdMasterAuthorizeAttribute(); var filterContext = new AuthorizationContext(controllerContext, actionDescriptor.Object); masterAttr.OnAuthorization(filterContext); // Assert Assert.AreEqual("", filterContext.HttpContext.Response); } 

在线: masterAttr.OnAuthorization(filterContext); 抛出NullReferenceException 。 我认为它与我们尚未嘲笑的上下文中的值有关。

任何帮助是极大的赞赏。

提前致谢。

真诚的,Yanik Ceulemans

没有属性的代码,人们只能猜测。 但是要开始调查,你可以使用MockBehavior.Strict创建你的MockBehavior.Strict 。 这样,当没有先前的设置调用mock上的方法或属性时,Moq将抛出exception。 该exception将具有方法/属性的名称:

 var httpContext = new Mock(MockBehavior.Strict);