Me está costando mucho tiempo entender cómo configurar un objeto que me permita probar mis llamadas jQuery. No necesito burlarme de ninguna llamada Async ni nada, solo uso básico. Así que permítanme puse mi función que quiero probar (truncada por simplicidad):Burlarse de jQuery para probar el uso básico
listGamesCallback : function(data) {
var gameList = $("#gameList select");
gameList.empty();
$.each(data, function() {
var newOption = $('<option>', {value : this.gameId });
newOption.text(string);
newOption.data("isJoinable", isJoinable);
// Add it to the list
gameList.append(newOption);
});
}
necesito para burlarse del jQuery aquí para unidad de prueba de este método, pero soy incapaz de encontrar la manera de hacer esto en javascript Incluso sin jsMockito, no sé cómo crear un objeto con las propiedades que jQuery tiene en esta situación. Cualquier ayuda con esto sería apreciada.
Estoy usando jsTestDriver, jsHamcrest, jsMockito y jQuery. Sin embargo, un enfoque generalizado para crear un objeto $ que tenga estas propiedades también sería asombroso. ¡Gracias!
Para aquellos que preguntaron, esto es lo que se me ocurrió que parecía funcionar un poco ... pero no entiendo por qué.
var saved$ = $;
var mockContruct = mockFunction();
var mockedGamelist = mock(jQuery);
var mockedOption = mock(jQuery);
mocked$ = (function() {
var test = function(name) {
var args = jQuery.makeArray(arguments);
return mockContruct.call(test, args);
};
$.extend(test, $);
// This is what confuses me. This worked, but it's wierd
// It allows me to use the regular jQuery functions like
// $.each, while returning mocked objects when selectors are used.
test.prototype.constructor = test;
return test;
})();
$ = mocked$;
when(mockContruct).call(anything(), hasItem(containsString("#gameList")))
.thenReturn(mockedGamelist);
when(mockContruct).call(anything(), hasItems(containsString("<option>"), both(object()).and(hasMember("value"))))
.thenReturn(mockedOption);
headerFunctions.listGamesCallback([ {
gameId : 1,
isWhitesTurn : false,
isGameOver : false,
whiteUserName : "foobar",
blackUserName : "barfoo"
} ]);
JsMockito.verify(mockedGamelist).empty();
JsMockito.verify(mockedGamelist).append(mockedOption);
$ = saved$;
Sería útil si también proporcionó su código de prueba. :) – alpian
Ok, perdón por la respuesta tardía, pero me han reasignado por lo que esta obtuvo una prioridad más baja. Tengo una forma complicada de ejecutar la prueba que edité en la pregunta. No está escrito muy bien porque no entiendo muy bien cómo jQuery hace lo que hace. – CrazyBS
La prueba que ha escrito realmente no prueba nada más que su código se ejecuta. También puede contaminar otras pruebas con problemas si falla porque no restaurará $ si falla. Creo que aún te estás perdiendo el objetivo de estas pruebas: debes escribir una prueba del ** comportamiento ** que esperas de tu código, no los detalles de cómo lo hace. Debería intentar escribir una prueba que solo se centre en probar que gameList tiene opciones X con cualquier valor en ellas una vez que se haya ejecutado su función. – alpian