2012-06-28 34 views
5

Tôi đang viết một bài kiểm tra đơn vị và phương pháp điều khiển là ném một ngoại lệ vì HttpContext/ControllerContext là null. Tôi không cần phải khẳng định bất cứ điều gì từ HttpContext, chỉ cần nó không phải là NULL. Tôi đã làm nghiên cứu và tôi tin rằng Moq là câu trả lời. Nhưng tất cả các mẫu mà tôi đã thấy đã không giúp tôi rất nhiều. Tôi không cần phải làm bất cứ điều gì ưa thích, chỉ để giả lập httpcontext. Chỉ cho tôi đúng hướng!Làm thế nào để giả lập httpcontext để nó không phải là null từ một bài kiểm tra đơn vị?

+1

Tôi nghĩ bài đăng này sẽ giúp bạn. http://stackoverflow.com/questions/542132/mocking-a-httpcontext-response-output-with-moq –

+1

OK! Bài đăng này đã giúp rất nhiều: http://www.emadibrahim.com/2008/04/04/unit-test-linq-to-sql-in-aspnet-mvc-with-moq/ Tạo một lớp HttpContextFactory với hai phương pháp. Một httpcontext chế nhạo và bối cảnh bộ điều khiển hiện tại thiết lập khác cho dữ liệu giả. – TheFlyingCircus

+0

Bạn nên đặt một số mẫu mã phác thảo giải pháp của bạn trên đây như là một câu trả lời cho câu hỏi của bạn. Hãy chắc chắn chấp nhận nó khi bạn có thể. –

Trả lời

6

Có hai chức năng này từ here trong một lớp học;

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; 
     } 


    } 

Từ thử nghiệm đơn vị Tôi gọi chúng như vậy;

HttpContextFactory.SetFakeAuthenticatedControllerContext(controller); 

Hãy chắc chắn rằng bạn đã Moq cài đặt trong dự án thử nghiệm của bạn:

Install-Package Moq 
0

Tôi biết đây là một chủ đề lớn tuổi, tuy nhiên Mocking một ứng dụng MVC cho unit tests là điều chúng ta làm trên cơ sở rất thường xuyên.

Tôi chỉ muốn thêm kinh nghiệm của mình Mocking một ứng dụng MVC 3 bằng cách sử dụng Moq 4 sau khi nâng cấp lên Visual Studio 2013. Không có kiểm tra đơn vị nào hoạt động trong chế độ gỡ lỗi và HttpContext đang hiển thị "không thể đánh giá biểu thức" khi cố gắng nhìn vào các biến.

Biến phòng thu trực quan 2013 có vấn đề về đánh giá một số đối tượng. Để gỡ lỗi các ứng dụng web giả lập hoạt động trở lại, tôi phải kiểm tra "Sử dụng Chế độ tương thích được quản lý" trong Công cụ => Tùy chọn => Gỡ lỗi => Cài đặt chung.