11

ASP.NET MVC 4 プロジェクト (.NET Framework 4) に取り組んでおり、カスタム AuthorizeAttribute (NUnit と Moq を使用) を適切に単体テストする方法を知りたいと思っていました。

と の2 つのメソッドを上書きAuthorizeCore(HttpContextBase httpContext)HandleUnauthorizedRequest(AuthorizationContext filterContext)ました。ご覧のとおり、これらのメソッドはそれぞれHttpContextBaseand を想定していますが、これらAuthorizationContextをモックする方法がわかりません。

これは私が得た限りです:

[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);aNullReferenceExceptionがスローされます。まだ嘲笑していないコンテキストの値と関係があると思います。

どんな助けでも大歓迎です。

前もって感謝します。

敬具 Yanik Ceulemans

4

1 に答える 1

8

属性のコードがなければ、推測することしかできません。しかし、調査を開始するには、 でモックを作成できますMockBehavior.Strict。そうすれば、モックのメソッドまたはプロパティが事前のセットアップなしで呼び出されると、Moq は例外をスローします。例外には、メソッド/プロパティの名前が付けられます。

var httpContext = new Mock<HttpContextBase>(MockBehavior.Strict);
于 2013-09-17T00:07:20.773 に答える