2008-10-27 22 views
10

Tôi đang cố gắng loại bỏ HttpContext để tôi có thể kiểm tra đơn vị cuộc gọi Request.IsAuthenicated của bộ điều khiển của tôi. Tôi đang sử dụng blog code that I found at Scott Hanselman's để mô phỏng HttpContext bằng cách sử dụng rhino.mocks. vì vậy tôi có điều này mảnh đơn vị kiểm tra:Mocking HttpContext không hoạt động

PostsController postsController = new PostsController(postDL); 
mocks.SetFakeControllerContext(postsController); 
Expect.Call(postsController.Request.IsAuthenticated).Return(true); 

Trong controller action tôi, tôi có một cái gì đó giống như if(Request.IsAuthenticated).... khi tôi cố gắng chạy thử nghiệm đơn vị, thử nghiệm không thành ném một ngoại lệ null, và khi tôi cố gắng gỡ lỗi kiểm tra đơn vị, tôi thấy rằng HttpContext không bao giờ được gán cho bộ điều khiển. bất kỳ ý tưởng nào?

Trả lời

0

Bây giờ, đối với tiết lộ, tôi vẫn chưa có được bàn tay của tôi bẩn với hầu hết những thứ bạn đang làm việc với, tuy nhiên:

Nếu bạn muốn thử các IsAuthenticated, tại sao không chỉ tạo ra một lớp tĩnh trở lại một bool có thể được điều khiển bởi mã thử nghiệm của bạn?

Đây là một chút thô tròn các cạnh, nhưng hy vọng bạn sẽ có được ý tưởng:

interface IAuthenticationChecker 
{ 
    bool IsAuthenticated { get; } 
} 

public class MockAuthenticationChecker : IAuthenticationChecker 
{ 
    static bool _authenticated = false; 

    public static void SetAuthenticated(bool value) 
    { 
     _authenticated = value; 
    } 
    #region IAuthenticationChecker Members 

    public bool IsAuthenticated 
    { 
     get { return _authenticated; } 
    } 

    #endregion 
} 

public class RequestAuthenticationChecker : IAuthenticationChecker 
{ 

    #region IAuthenticationChecker Members 

    public bool IsAuthenticated 
    { 
     get { 
      if (HttpContext.Current == null) 
       throw new ApplicationException(
        "Unable to Retrieve IsAuthenticated for Request becuse there is no current HttpContext."); 

      return HttpContext.Current.Request.IsAuthenticated; 
     } 
    } 

    #endregion 
} 

Sau đó, bạn có thể sử dụng một tham chiếu đến một trong hai ở cấp ứng dụng, yeah nó có nghĩa là bạn phải thêm một tài liệu tham khảo tại ứng dụng mức độ, và bạn cần phải sử dụng một ref khác chứ không phải là yêu cầu, nhưng bạn cũng có được toàn quyền kiểm soát xác thực để thử nghiệm :)

FYI - điều này hoàn toàn mở để bị thổi bay, tôi đã ném nó lại với nhau trong khoảng một phút :)

2

Điều này có thể được sử dụng để bạn, làm việc cho tôi trong một kịch bản tương tự:

http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx

+0

đây là phương pháp bạo lực khi bạn không có lớp HttpContextBase và cơ sở trừu tượng liên quan –

+0

liên kết tới nguồn không hoạt động – Juri

+0

Thử e- gửi thư Phil qua trang web của mình - http://haacked.com/contact.aspx – Kieron

8

này nên làm việc:

PostsController postsController = new PostsController(postDL); 
var context = mocks.Stub<HttpContextBase>(); 
var request = mocks.Stub<HttpRequestBase>(); 
SetupResult.For(request.IsAuthenticated).Return(true); 
SetupResult.For(context.Request).Return(request);  
postsController.ControllerContext = new ControllerContext(context, new RouteData(), postsController); 
0

Đây là một cách đơn giản để giả mạo ngữ cảnh, được tìm thấy từ Jeff's blog:

 TextWriter tw = new StringWriter(); 
     HttpWorkerRequest wr = new SimpleWorkerRequest("/webapp", "c:\\inetpub\\wwwroot\\webapp\\", "default.aspx", "", tw); 
     HttpContext.Current = new HttpContext(wr);