El problema aquí es que $()
es una función que devuelve un objeto con el método val()
. Por lo tanto, debe anotar $() para devolver un objeto trozado que tenga el método val.
$ = sinon.stub();
$.withArgs('#category').returns(sinon.stub({val: function(){}}));
Pero el principal error aquí es dejar que el código que desea probar llamar a la función $() para crear nuevas instancias. ¿Por qué? Su mejor práctica es no crear nuevas instancias en su clase, sino pasarlas al constructor. Digamos que usted tiene la función que va a obtener un valor de una entrada, doblar, y que escribe de nuevo a otro:
function doubleIt(){
$('#el2').val(('#el1').val() *2);
}
En este caso se crean 2 nuevos objetos llamando $()
. Ahora tiene que anotarse $()
para devolver un simulacro y un talón. Utilizando el siguiente ejemplo se puede evitar esto:
function doubleIt(el1, el2){
el2.val(el1.val() *2);
}
Mientras que, en el primer caso hay que stub $ para volver a trozo, en el segundo caso se puede pasar fácilmente un talón y un espía en su función.
lo que la prueba sinon para el segundo sería el siguiente:
var el1 = sinon.stub({val: function(){}});
el1.returns(2);
var el2 = sinon.spy({val: function(){}}, 'val')
doubleIt(el1, el2)
assert(el2.withArgs(4).calledOnce)
Así que, como usted no tiene elementos DOM aquí, sólo tiene que poner a prueba su lógica de la aplicación sin necesidad de crear el mismo dom como en tu aplicación
No he utilizado ninguna de esas bibliotecas, pero '' $ es un objeto de hecho (funciones son objetos en JavaScript). Aparte de eso, las funciones de jQuery funcionan cuando no se selecciona nada: '.val()' simplemente devolverá 'indefinido'. – pimvdb
Me sale que '.val()' devolverá 'undefined', pero ¿cómo puedo resguardar eso para probar mi' === '' '? – swilliams