C# 单元测试自定义MVC授权属性

C# 单元测试自定义MVC授权属性,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,这个问题几乎是重复的-但是我不能让我的代码运行而不点击相同的NullReferenceException 当我模拟我的控制器时,显然缺少了一些东西 我的属性很简单-如下所示: public override void OnAuthorization(AuthorizationContext filterContext) { if (!base.AuthorizeCore(filterContext.HttpContext)) { filterContext.Con

这个问题几乎是重复的-但是我不能让我的代码运行而不点击相同的
NullReferenceException

当我模拟我的控制器时,显然缺少了一些东西

我的属性很简单-如下所示:

public override void OnAuthorization(AuthorizationContext filterContext)
{
    if (!base.AuthorizeCore(filterContext.HttpContext))
    {
        filterContext.Controller.TempData.Add("RedirectReason", "Unauthorized");
    }
    base.OnAuthorization(filterContext);
}
我最近的尝试如下。我还尝试了引用链接中问题的代码,包括向上下文添加项目

 // Arrange
        Mock<IPrincipal> userMock = new Mock<IPrincipal>();
        Mock<HttpResponseBase> responseMock = new Mock<HttpResponseBase>();
        responseMock.SetupGet(res => res.Cache).Returns(new Mock<HttpCachePolicyBase>().Object);

        Mock<HttpContextBase> contextMock = new Mock<HttpContextBase>(MockBehavior.Strict);
        contextMock.SetupGet(cm => cm.User).Returns(userMock.Object);
        contextMock.SetupGet(cm => cm.Response).Returns(responseMock.Object);
        contextMock.SetupGet(cm => cm.Items).Returns(new Mock<IDictionary>().Object);

        Mock<ControllerContext> controllerContextMock = new Mock<ControllerContext>();
        controllerContextMock.SetupGet(ctx => ctx.HttpContext).Returns(contextMock.Object);

        Mock<ActionDescriptor> actionDesMock = new Mock<ActionDescriptor>();
        actionDesMock.Setup(action => action.GetCustomAttributes(typeof(AllowAnonymousAttribute), true)).Returns(new object[0]);

        // Act
        CustomAuthorizationAttribute cusAtr = new CustomAuthorizationAttribute() { Roles = "TestRole" };

        // Assert
        cusAtr.OnAuthorization(new AuthorizationContext(controllerContextMock.Object, actionDesMock.Object));

您引用了源代码。你有没有看一下它需要什么和你有什么设置?你设置了一个主要的模拟。伟大的但身份尚未确定。在检查用户呼叫时

if (!user.Identity.IsAuthenticated) //<-- Identity would be null.

这会让你越过最初的障碍。您可能仍然需要检查您的安排是否存在任何其他未正确安排的依赖项。

提供一个可用于重现问题的解决方案。帮助我们帮助你。必须去检查另一个问题来尝试拼凑您的属性进行测试,这使得帮助测试变得更加困难。不要假设我们已经有了相关问题的背景。准确地确定错误发生的位置。这个问题应该能够独立解决。@Nkosi-你介意让我知道我缺少什么吗?我已经提供了针对这个问题的每一段代码,以及我遇到的问题。不知道我还能补充什么?属性位于问题的顶部。我的测验在最后。我引用了另一个问题,因此我知道可能存在重复;而不是让用户试图关闭Q的基础上重复另一个上帝该死的-我失败了整个星期与这些测试。有一件事是肯定的,它们让您对框架有了更深入的了解!我确信我也试过了。非常感谢,成功了。是的,再次谢谢你,抬起头来。根据我在测试方法中看到的内容,您将发现更多的空错误。我会让你去解决的。愉快的编码。是的,我还有其他的错误,尽管那是因为我没有插上我的控制器。那些我能处理的比较容易。所有这些单元测试都有助于更多的学习:)单元测试有助于识别代码设计的好坏。测试代码的难度与代码编写的好坏直接相关。
if (!user.Identity.IsAuthenticated) //<-- Identity would be null.
//...

IPrincipal principal = new GenericPrincipal(new GenericIdentity("TestName"), new[] { "TestRole" });

httpContext.SetupGet(c => c.User).Returns(() => principal);

//...