gpt4 book ai didi

c# - ASP.NET MVC 单元测试自定义 AuthorizeAttribute

转载 作者:太空狗 更新时间:2023-10-29 17:52:02 24 4
gpt4 key购买 nike

我正在处理一个 ASP.NET MVC 4 项目(.NET 框架 4),我想知道如何正确地对自定义 AuthorizeAttribute 进行单元测试(我使用 NUnit 和 Moq)。

我覆盖了 2 个方法:AuthorizeCore(HttpContextBase httpContext)HandleUnauthorizedRequest(AuthorizationContext filterContext)。如您所见,这些方法分别需要 HttpContextBaseAuthorizationContext,但我不知道如何模拟这些。

据我所知:

[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。我认为它与我们尚未模拟的上下文中的值有关。

非常感谢任何帮助。

提前致谢。

真诚的,Yanik Ceulemans

最佳答案

没有属性代码只能猜测。但要开始调查,您可以使用 MockBehavior.Strict 创建模拟。这样,当在没有预先设置的情况下调用 mock 上的方法或属性时,Moq 将抛出异常。异常将具有方法/属性的名称:

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

关于c# - ASP.NET MVC 单元测试自定义 AuthorizeAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com