2013-09-09 4 views
9

Я работаю над проектом ASP.NET MVC 4 (.NET framework 4), и мне было интересно, как правильно протестировать пользовательский атрибут AuthorizeAttribute (я использую NUnit и Moq).ASP.NET MVC unit testing custom AuthorizeAttribute

I overrode 2 метода: AuthorizeCore(HttpContextBase httpContext) и HandleUnauthorizedRequest(AuthorizationContext filterContext). Как вы можете видеть, эти методы ожидают HttpContextBase и AuthorizationContext соответственно, но я не знаю, как их имитировать.

Это, насколько я получил:

[Test] 
public void HandleUnauthorizedRequest_UnexistingMaster_RedirectsToCommonNoMaster() 
{ 
    // Arrange 
    var httpContext = new Mock<HttpContextBase>(); 
    var winIdentity = new Mock<IIdentity>(); 
    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<HttpRequestBase>(); 
    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<ControllerBase>(); 
    var actionDescriptor = new Mock<ActionDescriptor>(); 
    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 отбрасывается. Я предполагаю, что это имеет какое-то отношение к ценности в контексте, который мы еще не издевались.

Любая помощь очень ценится.

Заранее спасибо.

С уважением, Яник Ceulemans

ответ

7

Без кода для атрибута можно только догадываться. Но чтобы начать расследование, вы можете создать свои mocks с помощью MockBehavior.Strict. Таким образом, Moq будет генерировать исключение, когда метод или свойство в mock вызываются без предыдущей настройки. Исключение будет иметь название метода/свойства:

var httpContext = new Mock<HttpContextBase>(MockBehavior.Strict); 
+3

Оказывается, мне не хватало свойство 'Items' на' HttpContext'. Вставка этого кода: 'var dictionary = new Dictionary (); httpContext.Setup (c => c.Items) .Returns (dictionary); 'решил мою проблему. Благодаря ! –