2010-10-20 16 views
15

L'introduzione a QUnit oltre a netTuts.com genera uno scambio interessante (mai risolto) su come applicare i test di unità contro le azioni che manipolano il DOM. La seguente citazione (Alex York) arriva al punto cruciale:Come possiamo eseguire i test unitari contro la manipolazione DOM?

Quanto sarebbe bello è che se si ha una funzione come questa:

funzione add (a, b) {var result = a + b; $ ("input # ResultTestBox"). Val (risultato);

Nel test di cui sopra, mi piacerebbe prova di due cose: l'aggiunta di un e B, e il risultato correttamente essere messo in un elemento DOM. Mi piacerebbe provare il secondo fornendo un po 'di codice HTML. Possibile?

Ma, come ho detto ... irrisolto. Risolvibile?

risposta

20

L'ultima versione di QUnit supporta un elemento #qunit-fixture che consente di aggiungere HTML alla pagina Web QUnit.

Ad esempio, nel codice HTML:

<ol id="qunit-tests"></ol> 
<div id="qunit-fixture">test markup, will be hidden</div> 

e nel tuo JavaScript:

$('<input id="ResultTestBox" type="text"/>').appendTo('#qunit-fixture'); 
var result = add(a, b); 

equals(result, $('input#ResultTestBox').val(), "testing result box value"); 
+0

Come è il test delle unità quando si basa effettivamente su manipolazioni dom reali? – Tushar

+2

@Tushar che dipende da quale delle 26 definizioni di test unitario stai utilizzando. Finché i test possono essere eseguiti indipendentemente l'uno dall'altro, sono test unitari secondo alcune definizioni. (come nel libro "Test Driven Development By Example" di Kent Beck) – herman

0

È possibile eseguire in env.js, se non si desidera che il fastidio di creare sandbox pagina html per tutti i tuoi test

2

Sicuramente quello che in realtà interessa è che il metodo val viene chiamato sul valore di ritorno di $(“input#ResultTestBox”) -Tu non hanno bisogno di verificare la funzionalità del metodo jQuery stesso. Perché non iniettare un'implementazione fittizia dell'oggetto jQuery e testarlo?

+0

Come si fanno a simulare oggetti jQuery senza perdere jQuery stesso? Come l'idea, ma avendo problemi a visualizzare come si farebbe a deridere nel codice. – Sukima

+4

@Sukima, si dovrebbe refactoring il codice originale in modo che l'oggetto '$' è passato come parametro, e per impostazione predefinita rendere quel valore parametro jQuery. Poi nei tuoi test unitari passi il tuo oggetto simulato –

+0

Mocking (almeno per cose diverse da chiamate remote, query di database ...) è un odore di codice. Se riesci a testare il risultato della chiamata piuttosto che a evitare il fatto che la chiamata stessa sia avvenuta, di solito è molto meglio. – herman