2017-06-07 7 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のソースコードもチェックアウトしました。

実行したとき、テストはNullReferenceException

base.AuthorizeCore(filterContext.HttpContext)に失敗は何が不足しているか把握することはできません。

簡単に、私たちのモデルに合うように調整し、他の質問からのコードの便宜上


です:あなたは、ソースコードを参照

// 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 - 私に何が足りないのか教えていただけますか?私はこの問題のために持っているすべてのコードを、私が経験している問題と一緒に提供しました。ほかに何が追加できるのかわからない?属性は質問の先頭にあります。私のテストは底にあります。他の質問を参考にして、重複の可能性があることを知るようにします。 – Darren

答えて

1

。あなたはそれが必要とするものとセットアップしたものを見ましたか?プリンシパルモックを設定します。すばらしいです。 IDは設定されていません。ユーザーが電話を確認中

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

別のGod Damnit - 私は今週末、これらのテストで失敗しています。 1つのことは確かに、彼らはあなたにフレームワークの大きな知識を与える!確かに私もそれを試したことを感じた。どうもありがとうございました。そして、うん、再びありがとう – Darren

+0

ちょうど頭が上がる。テスト中のメソッドで見たものに基づいて、さらにいくつかのnullエラーを返すでしょう。私はそれらを働かせるためにあなたを残すでしょう。ハッピーコーディング。 – Nkosi

+0

そして、私は他のエラーがあります。なぜなら、私はコントローラにボルトをかけなかったからです。私は簡単に対処することができます。すべてのこのユニットテストのものは、より多くの学習のためになります:) – Darren