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