2017-06-07 113 views
2

這個問題是相當多的ASP.NET MVC unit testing custom AuthorizeAttribute重複 - 但我不能讓我的代碼沒有擊中同一個NullReferenceException單元測試自定義MVC AuthorizationAttribute

東西顯然是失蹤,當我嘲笑了我的控制器上運行。

我的屬性很簡單 - 是這樣的:

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)); 

我也檢查了AuthorizeCore的源代碼。

當跑,在測試上base.AuthorizeCore(filterContext.HttpContext)失敗了NullReferenceException

想不通有什麼遺漏。

有什麼想法嗎?


爲了方便起見,代碼從另一個問題,調整,以適應我們的模型是:

// Arrange 
    var httpContext = new Mock<HttpContextBase>(); 
    Dictionary<object, object> dictionary = new Dictionary<object, object>(); 
    httpContext.SetupGet(cm => cm.Items).Returns(dictionary); 
    Mock<IPrincipal> userMock = new Mock<IPrincipal>(); 
    httpContext.SetupGet(c => c.User).Returns(() => userMock.Object); 
    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); 

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

    // Act 
    cusAtr.OnAuthorization(new AuthorizationContext(controllerContext, actionDescriptor.Object)); 
+0

提供可用於重現問題的[mcve]。幫助我們來幫助你。不得不去檢查另一個問題,嘗試拼湊你的屬性進行測試,這使得幫助變得更加困難。不要以爲我們已經有了關聯問題的背景。準確識別出錯位置。這個問題應該能夠自立。 – Nkosi

+0

@Nkosi - 你介意讓我知道我錯過了什麼嗎?我已經提供了我對這個問題的每一段代碼,以及我遇到的問題。不知道我還能添加什麼?該屬性位於問題的頂部。我的測試是在底部。我引用另一個問題,因此讀取知道可能有重複;而不是讓用戶試圖根據重複來關閉Q. – Darren

回答

1

你所引用的源代碼。你有沒有看看它需要什麼和你有什麼設置?你設置了一個主要的模擬。大。但身份沒有設置。在檢查用戶的呼叫

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

這將空出來,因爲Identity沒有安排。

只需創建一個通用主體並使用它即可。所有必需的依賴關係都會爲你初始化。

//... 

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

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

//... 

這會讓你過去最初的障礙。您可能仍然需要檢查您的安排,以確定沒有正確安排的其他依賴項。

+0

另一位上帝詛咒 - 我本週在這些測試中都失敗了。有一件事是肯定的,他們會給你更多關於框架的知識!我很確定我也嘗試過。非常感謝,它做到了。而且,是的,再次感謝 – Darren

+0

只是一個領導。你會反彈一些更多的空錯誤,只是基於我看到你在你的測試方法中有什麼。我會讓你解決它。快樂的編碼。 – Nkosi

+0

而且,我還有其他錯誤,那是因爲我沒有使用我的控制器。那些我可以處理更容易。所有這些單元測試的東西使更多的學習:) – Darren