2012-12-03 22 views
10

Tôi đang viết một số kiểm tra đơn vị cho một phương thức lấy một HttpContext làm tham số. Tôi muốn kiểm tra xem hành vi có đúng như mong đợi khi yêu cầu là POST hay không.Xây dựng một HttpContext để thử nghiệm, làm thế nào tôi có thể chỉ định HttpRequest là một POST?

Khi tạo System.Net.HttpWebRequest thật dễ dàng để đặt phương thức, nhưng tôi không thể thấy cách để chỉ định phương thức khi tạo System.Web.HttpRequest, đây là những gì được sử dụng trong HttpContext.

Bất kỳ ý tưởng nào?

Đối với ngữ cảnh, phương thức này được gọi bởi người tán thành và nó được cho là ném 405 nếu yêu cầu không phải là POST. Tôi biết rằng tôi có thể lọc các phương thức cho phép với thuộc tính động từ trong web.config, và tôi sẽ, tuy nhiên không có gì ngăn ai đó trong tương lai thay đổi thuộc tính động từ để cho phép các phương thức khác trong trường hợp này tôi muốn xử lý của chính nó.

Helper phương pháp đang được sử dụng:

private HttpContext GetHttpContext(string requestUrl) 
    { 
     var httpRequest = new HttpRequest("", requestUrl, "");    
     var stringWriter = new StringWriter(); 
     var httpResponce = new HttpResponse(stringWriter); 
     return new HttpContext(httpRequest, httpResponce); 
    } 
+0

Sử dụng HttpContext.Current.Request.HttpMethod. Thông qua http://stackoverflow.com/questions/6898598/http-verb-of-current-http-context –

+1

HttpMethod là một getter chỉ, không phải là một setter, do đó, sẽ không làm việc để thử nghiệm. – mdchris

+1

Tôi đã chỉnh sửa tiêu đề của bạn. Vui lòng xem, "[Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?] (Http://meta.stackexchange.com/questions/19190/)", trong đó sự đồng thuận là "không, họ không nên". –

Trả lời

5

Tôi muốn giới thiệu nghiên cứu đối tượng chế giễu với mục đích kiểm tra đơn vị. Có một vài khuôn khổ mocking có sẵn cho .NET để tạo điều kiện thuận lợi cho loại thử nghiệm này.

Ví dụ: bài viết here đặt HttpMethod bằng khung công tác Moq.

Từ bài viết:

public ContextMocks(Controller onController, string HTTPMethod) 
{ 
    //... 
    Request = new Moq.Mock<HttpRequestBase>(); 
    Request.Setup(x => x.HttpMethod).Returns(HTTPMethod); 
    //... 
} 

Điều đó nói rằng, nếu điều này là một thử nghiệm một lần, và tôi không thể nhấn mạnh rằng đủ, và các chi phí phát sinh bằng cách giới thiệu đối tượng mocking là không cần thiết trong tình hình cụ thể của bạn , sự phản xạ sau đây sẽ thiết lập các HttpMethod:

typeof(HttpRequest).GetField("_httpMethod", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(httpRequest, "POST"); 

Như tôi đã đề cập trước đó, nếu thử nghiệm với HttpContext, HttpRequest, vv có hoặc sẽ trở thành một chủ đề lặp đi lặp lại, sau đó tận dụng lợi thế của một khuôn khổ mocking. Bạn sẽ tiết kiệm thời gian trong thời gian dài.

+0

Xin cảm ơn, tôi đã nghĩ về nó tối qua và đã tìm ra nếu không có phương pháp nào dễ dàng hơn tôi chỉ cần sử dụng sự phản chiếu, nhưng muốn tránh lựa chọn đó nếu tôi có thể không bảo đảm một trường riêng hiện có sau khi thay đổi phiên bản. Tôi nghĩ rằng việc chế nhạo sẽ là những gì tôi phải làm, chỉ là hy vọng nó không cần thiết và tôi chỉ thiếu một cái gì đó. – mdchris

+0

Cũng giống như tôi đang bị mắc kẹt bằng cách sử dụng phản ánh, HttpRequest được niêm phong vì vậy tôi không thể giả mạo nó. Đây không phải là một ứng dụng MVC để ngữ cảnh sử dụng HttpRequest thay vì HttpRequestBase ... – mdchris

Các vấn đề liên quan