は、この質問はかなり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));
は、問題を再現するために使用できる[mcve]を提供します。私たちがあなたを助けるのを助けてください。テストのためにあなたの属性を一緒に試してみるために別の質問をチェックしなければならないと、それをより困難にする助けになります。私たちは既にリンクされた質問の背景を持っていると仮定しないでください。エラーが発生した場所を正確に特定します。問題は、それ自体で立つことができるはずです。 – Nkosi
@Nkosi - 私に何が足りないのか教えていただけますか?私はこの問題のために持っているすべてのコードを、私が経験している問題と一緒に提供しました。ほかに何が追加できるのかわからない?属性は質問の先頭にあります。私のテストは底にあります。他の質問を参考にして、重複の可能性があることを知るようにします。 – Darren