Il problema qui è che $()
è una funzione che restituisce un oggetto con il metodo val()
. Quindi devi stub $() per restituire un oggetto stoppato con il metodo val.
$ = sinon.stub();
$.withArgs('#category').returns(sinon.stub({val: function(){}}));
Ma l'errore principale è quello di lasciare che il codice che si desidera testare chiamare la funzione $() per creare nuove istanze. Perché? È consigliabile non creare nuove istanze nella classe, ma passarle nel costruttore. Diciamo che avere la funzione che otterrà un valore di un ingresso, doppio, e scrivere di nuovo ad un altro:
function doubleIt(){
$('#el2').val(('#el1').val() *2);
}
In questo caso è creare 2 nuovi oggetti chiamando $()
. A questo punto è necessario eseguire lo stub $()
per restituire un mock e uno stub. Utilizzando l'esempio seguente è possibile evitare questo:
function doubleIt(el1, el2){
el2.val(el1.val() *2);
}
Mentre, nel primo caso si deve stub $ per restituire uno stub, nel secondo caso si può facilmente passare una stub e una spia nella vostra funzione.
Quindi il test Sinon per la seconda sarebbe simile a questa:
var el1 = sinon.stub({val: function(){}});
el1.returns(2);
var el2 = sinon.spy({val: function(){}}, 'val')
doubleIt(el1, el2)
assert(el2.withArgs(4).calledOnce)
Così, mentre non si hanno elementi DOM qui, si può semplicemente testare la logica dell'applicazione senza bisogno di creare lo stesso dom come nella tua app.
fonte
2011-12-15 20:57:55
Non ho usato nessuna di queste librerie, ma '$' è un oggetto infatti (le funzioni sono oggetti in JavaScript). A parte questo, le funzioni di jQuery funzionano quando non è selezionato nulla - '.val()' restituirà 'undefined'. – pimvdb
Ho capito che '.val()' restituirà 'undefined', ma come posso quindi stubare per testare il mio' === '' '? – swilliams