2012-04-06 20 views
7

Próbuję utworzyć klasę opakowania do przetwarzania zawartości HttpContext. Tworzę plik cookie, ale nie mogę dodać do HttpContext.Request lub kolekcji plików cookie odpowiedzi.Dodaj plik cookie do kolekcji Request.Cookies

Używam Moq. Również używam MvcMockHelp z poniższego linku: http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx

Gdy próbuję dodać do kolekcji Cookies w moim następującego kodu:

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

pojawia się następujący błąd na 4 linii kodu c1. Request.Cookies.Add (aCookie);

Object reference not set to an instance of an object. 

Próbowałem również instancji obiektu kontekstowego następująco ale nadal nie ma szczęścia

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

widzę, że kolekcja Cookies wewnątrz Zamówienie jest NULL. Jak utworzyć instancję?

Próbowałem również następujących, ale bez powodzenia.

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

Proszę dać mi znać, co robię źle.

+0

Sprawdzić, czy Cookies jest null, jeśli tak, to oznacz ją. – Landern

+0

Nie mogę utworzyć pliku cookie. Czy mogę pobrać próbkę, aby utworzyć kod c1.Request.Cookies, jeśli to możliwe? –

+0

Czy możesz utworzyć instancję za pomocą tego konstruktora: 'FakeHttpContext (adres URL łańcucha)' zamiast? Przekazywanie żądanego adresu URL; może to pomoże utworzyć instancję obiektu 'Request'. –

Odpowiedz

8

Patrząc na kod Hansleman za właściwość Request jest tworzona jako Mock jednak właściwości tej makiety nie są ustawione, więc dlatego Cookies jest zerowy, a nie można ustawić go, jak to jest do odczytu tylko własność.

Masz dwie opcje:

  1. Setup mock obiektu w metodzie FakeHttpContext() Cookies lub
  2. Jeśli nie chcesz tego zrobić, że jesteś odwołanie do biblioteki bezpośrednio, to można po prostu odtworzyć szydzili HttpRequestBase z HttpContextBase masz dostęp do, tak:

    [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) zwróci ci makietę, możesz ustawić na niej ciasteczka i użyć go.

Ogólnie można odtworzyć Object w jego Mock za pomocą metody statycznej Get(MockedThing.Object)

+0

Przepraszamy za "a", nie widzę, jak blok kodu wynika bezpośrednio z listy. – nicodemus13

+0

Kod jest tylko dla części 2 listy, więc * powinien * być jego częścią, co jest realizowane przez wcięcie 8 spacji zamiast 4. – ErikE