2008-09-22 17 views
8

Czytałem wpis autorstwa Brada Wilsona (http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html) na temat nowych zmian ViewEngine do Podglądu 5 MVC i pomyślałem, że byłoby wspaniale móc renderować widok na ciąg do użytku w testach. Na podstawie artykułu mogę wywnioskować, że jest to możliwe, ale nie wiem, jak to zrobić.Podgląd MVC 5 - Renderowanie widoku na ciąg do testowania

Wierzę, że pozwoliłoby to nam znieść niektóre z naszych testów WatIn (które są powolne i niewiarygodne), ponieważ pozwoliłoby nam sprawdzić poprawność renderowania, po prostu sprawdzając ciąg znaków dla oczekiwanych wartości/tekstu.

Czy ktoś zaimplementował coś takiego?

Odpowiedz

5

To trudne. To, co musisz zrobić, to ustawić właściwość Response.Filter na niestandardową klasę strumieniową, którą implementujesz. Projekt MVC Contrib faktycznie ma przykłady tego. Wdałbym się tam.

0

Ponadto testowanie może być przydatne dla komponentów takich jak konwertery HTML na PDF. Te komponenty zazwyczaj używają dwóch sposobów transformacji.

  • Podanie adresu URL do sposobu konwersji
  • przekazując zawartość HTML (i opcjonalnie można określić baseURL rozwiązywać wirtualne ścieżki)

używam filtru Autoryzuj wewnątrz sterownika, więc jeśli przekierowuję do adresu URL, renderowany kod HTML jest stroną logowania (używam niestandardowego uwierzytelniania).

Jeśli używam Server.Execute (Url), aby zachować kontekst, metoda się nie powiedzie (HttpUnhandledException: Błąd podczas wykonywania żądania podrzędnego dla/Template/Pdf/1.).

Próbowałem pobrać kod HTML renderowanego obiektu ViewResult, ale mi się nie udało.

1

Myślę, że tutaj jest to, czego potrzebujesz. Funkcja RenderPartialToString zwróci kontroler jako ciąg znaków. Dostaję go od here.

public static string RenderPartialToString(string controlName, object viewData) 
{ 
    ViewDataDictionary vd = new ViewDataDictionary(viewData); 
    ViewPage vp = new ViewPage { ViewData = vd }; 
    Control control = vp.LoadControl(controlName); 

    vp.Controls.Add(control); 

    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
     { 
      vp.RenderControl(tw); 
     } 
    } 

    return sb.ToString(); 
}