2011-01-29 9 views
9

Sto provando il motore di visualizzazione Razor MVC3 e una delle funzionalità che sto esplorando è la possibilità di visualizzare le viste dell'unità.Test unità MVC3 Assistenti per il rasoio/viste senza stringhe

Ho visto un certo numero di esempi in cui le viste del rasoio possono essere compilate in un assieme e trasformate in una stringa. Il problema è che esegue il rendering come una stringa, quindi sono rimasto con le ricerche di stringhe!

Ecco cosa sto cercando di fare.

  1. Creare un aiutante Razor
  2. Compile aiutante
  3. Run aiutante compilato, passando in un ViewModel
  4. Prendi l'uscita del soccorritore, come una sorta di struttura/XML/albero HTML

Il motivo per cui voglio farlo è che posso testare parti specifiche dell'output. L'helper probabilmente sputerà HTML che include vari gunk di output. Quello che voglio fare è vedere se c'è una Checkbox con un valore particolare (per esempio). Se hai visto i test del selenio, è simile a quello che vorrei fare, tranne che non come test guidati da server.

C'è un modo per ottenere viste Razor (o altro motore di visualizzazione) compilate per emettere qualcosa di diverso dalle stringhe?

risposta

4

La risposta breve è no, perché lo scopo dei motori di visualizzazione nella vita è quello di sputare stringhe. L'analisi di tali stringhe in un documento XML è un modo per dare loro una piccola struttura, come suggerito da @ Craig-M. Ma quello che devi chiedertelo è ciò che stai veramente testando. Se la tua vista compila e genera una specie di HTML, ci possono essere tre problemi con ciò che ha generato:

  • i dati visualizzati non sono corretti. Dovresti testarlo a livello di controller, quindi puoi ignorarlo durante il test della vista.
  • il framework MVC ha avuto un errore e ha generato la stringa HTML errata. Non ti preoccupare di questo, perché MVC ha la sua suite di test e, grazie alla separazione dei problemi, non è un tuo problema.
  • l'HTML ha infranto l'interfaccia utente.

Quest'ultimo sarebbe molto bello da testare, ma perché non testarlo nei test di unità javascript? Scopri le popolari suite di test di javascript come JsUnit, FireUnit, QUnit, ecc. Faranno tutti un lavoro molto migliore di quello che potresti fare per analizzare l'output di Razor.

Penso che il valore assegnato a una casella di controllo sia probabilmente testato per il test del controller. Ma per usare il tuo esempio, testare il valore della casella di controllo potrebbe essere $ ('# theCheck'). Val() == 'il valore'. Ed è possibile eseguirli su un sito Web in esecuzione con repository o servizi con iniezioni di dipendenze per controllare cose come "il valore".

Solo un pensiero.

+0

Grazie per l'eccellente risposta. Il motivo per il test a livello HTML è di testare la logica nella vista. Ad esempio, se si passa in un ViewModel che contiene prodotti e ha una proprietà di magazzino. Se un prodotto ha stock == 0, non mostrare un link di acquisto. Successivamente, aggiungo la logica nel ViewModel per garantire che i prodotti non abbiano mai stock == 0, ma invece utilizzare IsInStock? proprietà. Voglio un test che fallirà perché non produce il codice HTML corretto. Un modo per scrivere questo test è costruire un ViewModel legittimo, passarlo alla vista e controllare che il link sia/non sia generato. Ha senso? Grazie, –

+0

Sì, seguo. Verificare che il collegamento esista in QUnit sia qualcosa di semplice come: test ("testing per link", function() { ok ($ ('# myLink'). Length == 1, "link present"); }); – Milimetric

1

Un modo per procedere è analizzare la stringa html in un XDocument e richiedere all'assembly di restituirla. Quindi puoi interrogare contro di esso con LINQ nei tuoi test.

Modifica: Sto cercando di capire anche una strategia di test Razor. Sarei interessato a sapere come far funzionare l'aiutante. Finora, sto disegnando uno spazio vuoto nel renderli resi a stringhe al di fuori del framework MVC.

+0

Questa è la direzione che sto seguendo adesso. Anche con Razor, è una sorta di fastidio per far sì che tutte le dipendenze funzionino correttamente (ad es. TempData) per testare una vista. Potrei esaminare altri View Engine, ma penso che sia ASP.NET MVC che è il problema. Fammi sapere se fai progressi! Grazie –

+0

Ho trascorso due giorni a provare vari metodi per ottenere il rendering delle viste su una stringa. Nessuna fortuna finora. Ogni percorso si scontrava con una sorta di resistenza, come quella di dover istanziare una classe interna o non essere in grado di utilizzare gli helper MVC. Dato che stiamo già facendo test WebAii su questo progetto, ho perso tempo per farlo funzionare e ho dovuto abbandonare i miei sforzi. Sono molto interessato a farlo sui miei progetti e sicuramente tornerò qui se/quando avrò una soluzione. –

+0

Un po 'tardi, ma ho inviato parti per ottenere un cablaggio di test dell'unità operativa per le visualizzazioni del rasoio nella seguente domanda: http://stackoverflow.com/questions/8720222/how-do-i-test-views-using-razor- syntax-in-mvc3 – Lucero

1

Che ne dici di rendere le tue visualizzazioni in html e quindi di inviare tale codice HTML alla libreria HtmlAgility? In questo modo puoi facilmente navigare/navigare nel tuo html. Non penso che ci sia un modo per farlo con MVC stesso.

+0

Questa è la direzione in cui sono finito. Con l'avvento di HTML5, sembra che aspettare che il vero XML abbia un problema in seguito. –