2012-06-28 20 views
5

Bir birim testi yazıyorum ve HttpContext/ControllerContext boş olduğundan denetleyici yöntemi bir istisna atar. HttpContext'ten bir şey almam gerekmiyor, sadece NULL olmamasına gerek yok. Araştırma yaptım ve Moq'un cevabı olduğuna inanıyorum. Fakat gördüğüm tüm örnekler bana çok yardımcı olmadı. Httpcontext ile dalga geçmek için süslü bir şey yapmam gerekmiyor. Bana doğru yönde gelin!httpcontext ile alay etme, ünite testinden null olmaması nasıl olur?

+1

Bu yazının size yardımcı olacağını düşünüyorum. http://stackoverflow.com/questions/542132/mocking-a-httpcontext-response-output-with-moq –

+1

Anladım! Bu gönderi çok yardımcı oldu: http://www.emadibrahim.com/2008/04/04/unit-test-linq-to-sql-in-aspnet-mvc-with-moq/ Bir HttpContextFactory Sınıfı ile birlikte yapıldı iki yöntem. Bir alaycı httpcontext ve diğer ayarlanan denetleyici bağlamı alaylanmış verilere. – TheFlyingCircus

+0

Sorunuza bir çözüm olarak, çözümünüzü burada özetleyen bir örnek kod koymalısınız. Yapabildiğiniz zaman kabul ettiğinizden emin olun. –

cevap

6

Bu iki işlevi bir sınıfta here'dan aldınız;

public static class HttpContextFactory 
    { 
     public static void SetFakeAuthenticatedControllerContext(this Controller controller) 
     { 

      var httpContext = FakeAuthenticatedHttpContext(); 
      ControllerContext context = 
      new ControllerContext(
      new RequestContext(httpContext, 
      new RouteData()), controller); 
      controller.ControllerContext = context; 

     } 


     private static HttpContextBase FakeAuthenticatedHttpContext() 
     { 
      var context = new Mock<HttpContextBase>(); 
      var request = new Mock<HttpRequestBase>(); 
      var response = new Mock<HttpResponseBase>(); 
      var session = new Mock<HttpSessionStateBase>(); 
      var server = new Mock<HttpServerUtilityBase>(); 
      var user = new Mock<IPrincipal>(); 
      var identity = new Mock<IIdentity>(); 

      context.Setup(ctx => ctx.Request).Returns(request.Object); 
      context.Setup(ctx => ctx.Response).Returns(response.Object); 
      context.Setup(ctx => ctx.Session).Returns(session.Object); 
      context.Setup(ctx => ctx.Server).Returns(server.Object); 
      context.Setup(ctx => ctx.User).Returns(user.Object); 
      user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
      identity.Setup(id => id.IsAuthenticated).Returns(true); 
      identity.Setup(id => id.Name).Returns("a.ali174"); 

      return context.Object; 
     } 


    } 

Birim testinden, onları böyle aradım;

HttpContextFactory.SetFakeAuthenticatedControllerContext(controller); 

Eğer testler projede Moq yüklü olduğundan emin olun:

Install-Package Moq 
0

Ben ancak birim testler için MVC uygulama alaycı, bu eski bir konu olduğunu biliyoruz biz çok düzenli olarak yapmak bir şeydir.

Sadece deneyimlerimi eklemek istedim Visual Studio 2013'e yükselttikten sonra Moq 4'ü kullanarak MVC 3 uygulamasının yüklenmesi. Birim testlerinin hiçbiri hata ayıklama modunda çalışmıyordu ve HttpContext, çalışırken "ifade değerlendirilemedi" mesajı veriyordu. değişkenlere göz atmak.

Görsel stüdyo çıkıyor, bazı nesneleri değerlendiren sorunlar var. Hatalı bir şekilde çalışan web uygulamalarının hata ayıklanmasını sağlamak için, Araçlar => Seçenekler => Hata Ayıklama => Genel ayarlarında "Yönetilen Uyumluluk Modunu Kullan" seçeneğini işaretlemem gerekiyordu.