2012-04-06 41 views
7

Tôi đang cố gắng tạo một lớp trình bao bọc để xử lý nội dung của HttpContext. Tôi đang tạo một cookie nhưng không thể thêm vào bộ sưu tập cookie HttpContext.Request hoặc Response.Thêm cookie vào bộ sưu tập Request.Cookies

Tôi đang sử dụng Moq. Ngoài ra tôi đang sử dụng MvcMockHelp từ liên kết sau: http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx

Khi tôi cố gắng thêm vào bộ sưu tập Cookies trong đoạn mã sau của tôi:

 HttpContextBase c1 = MvcMockHelpers.FakeHttpContext(); 
     HttpCookie aCookie = new HttpCookie("userInfo"); 
     aCookie.Values["userName"] = "Tom"; 
     c1.Request.Cookies.Add(aCookie); <------ Error here 

tôi nhận được lỗi sau trên dòng thứ 4 mã c1. Request.Cookies.Add (aCookie);

Object reference not set to an instance of an object. 

Tôi cũng đã cố gắng instantiating đối tượng bối cảnh như sau nhưng vẫn không có may mắn

HttpContextBase c = MvcMockHelpers.FakeHttpContext 
      ("~/script/directory/NAMES.ASP?city=irvine&state=ca&country=usa"); 

Tôi thấy rằng Cookies bộ sưu tập bên trong Yêu cầu là NULL. Làm thế nào để tôi khởi tạo nó?

Tôi cũng đã thử những điều sau nhưng không may mắn.

c1.Request.Cookies["userName"].Value = "Tom"; 

Vui lòng cho tôi biết tôi đang làm gì sai.

+0

Hãy kiểm tra để xem nếu Cookies là null, nếu như vậy, nhanh chóng nó. – Landern

+0

Tôi không thể khởi tạo Cookies .. Tôi có thể lấy mẫu để khởi tạo mã c1.Request.Cookies nếu có thể không? –

+0

Bạn có thể khởi tạo bằng cách sử dụng hàm tạo này: 'FakeHttpContext (chuỗi url)' thay thế không? Chuyển url yêu cầu; có lẽ nó sẽ giúp khởi tạo đối tượng 'Request' của bạn. –

Trả lời

8

Nhìn vào ma Hansleman của, tài sản Request được tạo ra như một Mock, tuy nhiên, các tính chất của mô hình mà không phải cài đặt, vì vậy đó là lý do tại sao Cookies là null, và bạn không thể đặt nó, vì nó là một Read- chỉ tài sản.

Bạn có hai lựa chọn:

  1. Thiết lập các mô hình của Cookies tài sản trong phương pháp FakeHttpContext() , hoặc
  2. Nếu bạn không muốn làm điều đó, nói rằng bạn đang tham khảo thư viện trực tiếp, sau đó bạn chỉ có thể reconstitute chế giễu HttpRequestBase từ HttpContextBase bạn có quyền truy cập vào, như vậy:

    [Test] 
    public void SetCookie() 
    { 
        var c1 = MvcMockHelpers.FakeHttpContext(); 
        var aCookie = new HttpCookie("userInfo"); 
        aCookie.Values["userName"] = "Tom"; 
    
        var mockedRequest = Mock.Get(c1.Request); 
        mockedRequest.SetupGet(r => r.Cookies).Returns(new HttpCookieCollection()); 
        c1.Request.Cookies.Add(aCookie); 
    
        Debug.WriteLine(c1.Request.Cookies["userInfo"].Value); 
    } 
    

    Mock.Get(object) sẽ trả lại cho bạn Mock, sau đó bạn có thể thiết lập các cookie trên đó và sử dụng nó.

Nói chung bạn có thể tái tạo một Object vào Mock của nó bằng cách sử dụng phương pháp tĩnh Get(MockedThing.Object)

+0

Xin lỗi vì 'a', tôi không thể xem cách chặn mã theo dõi trực tiếp từ danh sách. – nicodemus13

+0

Mã chỉ dành cho phần 2 của danh sách, vì vậy nó * nên * là một phần của nó, được thực hiện bằng cách thụt lề 8 dấu cách thay vì 4. – ErikE

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