SORU
7 Aralık 2010, Salı


Alay HttpContext.Test geçerli Init Yöntemi

Yaptım ASP.NET MVC uygulama için birim testi eklemek için çalışıyorum. Benim birim testleri aşağıdaki kodu kullanın:

[TestMethod]
public void IndexAction_Should_Return_View() {
    var controller = new MembershipController();
    controller.SetFakeAuthenticatedControllerContext("TestUser");

    ...
}

Aşağıdaki denetleyicisi bağlam alay yardımcıları:

public static class FakeControllerContext {
    public static HttpContextBase FakeHttpContext(string username) {
        var context = new Mock<HttpContextBase>();

        context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));

        if (!string.IsNullOrEmpty(username))
            context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));

        return context.Object;
    }

    public static void SetFakeControllerContext(this Controller controller) {
        var httpContext = FakeHttpContext(null);
        var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
        controller.ControllerContext = context;
    }

    public static void SetFakeAuthenticatedControllerContext(this Controller controller, string username) {
        var httpContext = FakeHttpContext(username);
        var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
        controller.ControllerContext = context;
    }
}

Bu test sınıfı: hangi temel sınıfından miras alır

[TestInitialize]
public void Init() {
    ...
}

Bu yöntem içinde aşağıdaki kodu çalıştırmak için çalışan bir kütüphane hiç kontrol edemediğimiz () çağırır:

HttpContext.Current.User.Identity.IsAuthenticated

Şimdi muhtemelen sorun görebilirsiniz. Bu temel Init yöntemi denetleyicisine ama sahte HttpContext set var. Birim test / alay bunu doğru anladığımdan emin olmak istiyorum bu yüzden benim için çok yeni. Beni böylece dışarı HttpContext Alay etmek için doğru yol nedir benim denetleyicisi arasında paylaşılan ve Init yöntemi olarak adlandırılan herhangi bir kütüphane.

Çok memnun olurum. Teşekkürler

CEVAP
7 Aralık 2010, Salı


HttpContext.Current System.Web.HttpContextBase aşmıyor System.Web.HttpContext bir örneğini verir. HttpContextBase sonraki HttpContext alay zor olan adrese eklenmiştir. İki sınıf temelde ilgisiz (HttpContextWrapper aralarında bir adaptör olarak kullanılır).

Neyse ki, HttpContext fakeable IPrincipal (Kullanıcı) ve IIdentity değiştirmek için yeterli kendisidir.

Aşağıdaki kod beklendiği gibi, hatta bir konsol uygulaması olarak çalışır:

HttpContext.Current = new HttpContext(
    new HttpRequest("", "http://tempuri.org", ""),
    new HttpResponse(new StringWriter())
    );

// User is logged in
HttpContext.Current.User = new GenericPrincipal(
    new GenericIdentity("username"),
    new string[0]
    );

// User is logged out
HttpContext.Current.User = new GenericPrincipal(
    new GenericIdentity(String.Empty),
    new string[0]
    );

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • KarnasCamillo

    KarnasCamill

    24 EKİM 2007
  • RawBrahs

    RawBrahs

    28 Aralık 2010