2009-12-03 13 views
5

Tengo dificultades para invocar document.ready (function() {}) en mis pruebas unitarias. Supongamos que tengo varios de ellos en mi archivo de Javascript, y uno de ellos se llama el interior de una función llamada es decir

function myFunction() { 
    $(document).ready(function() { 
     //... 
    }); 
} 

¿Cómo realmente invocarlos en mis pruebas de unidad, así que puede probarlos? Estoy usando JsTestDriver para probar mis javascripts.

Gracias.

Respuesta

0

Parte de la respuesta a esta pregunta se puede encontrar en here.

A continuación se muestra el código de ejemplo para responder a esta pregunta basada en la respuesta anterior:

myFunction(); 
$.readyList[1](); 

El índice asume que sólo hay 1 document.ready función en el archivo de origen. El índice 0 se refiere a otra cosa que creo que es información en el navegador.

5

Usted sabe document.ready... funciona así que simplemente comience llamando las funciones dentro de él. Idealmente, si solo tiene una función init llamada por la función lista, llama a una función, hace lo que necesita y puede continuar con sus pruebas.

+0

estoy de acuerdo que así es como lo hago, pero la mayoría de las personas probablemente no necesiten una función init. –

0

Le sugiero que refactorice el código. Incluso si encuentra una forma de llamarlo, será difícil de entender para otros desarrolladores.

Además (en mi humilde opinión, no estoy seguro) debe llamar a los controladores listos incluso después de que se desencadenó el evento de páginas preparadas, porque si "instala" el controlador ready(), si el evento document.ready ya estaba trigger, jquery llama inmediatamente a ese manejador (por lo que nunca pierde ese evento, incluso si su código agregó un manejador demasiado tarde, es decir, mucho después de que document.ready todavía estaba hecho).

¿No podría simplemente crear un evento de usuario my_on_read()? O algo así?

Bueno, al final, por favor, sólo cuidar de listo() eventos y controladores que serán instalados después de la document.ready() ya está hecho :)

+0

Otro detalle para pensar dos veces sobre el diseño: ¿Puede reproducirse siempre cuando ocurre esta "adición" de un controlador? En este ejemplo, significa, ¿se llamará siempre a "myFunction" en esta o aquella página? Usted (u otro desarrollador) tiene que _interpretar_ que esta función instalará un controlador listo - ¡no es obvio! No veo valor en agregar manejadores listos en el código "distinto de global". Bueno, simplemente agregue el controlador listo en código global y mueva su código global a un lugar central. Estoy seguro, esto te hará cuestionar obsoleto entonces. Parece que encontraste un defecto de diseño importante en la aplicación ... – Frunsi

6

Si se trata de una prueba de unidad, estoy Supongo que verifica las salidas de la función cuando se le dan ciertas entradas?

Aquí es mi opinión:

Usted debe prepararse para el caso en que document.ready se llama y el caso en que no lo es.

Por lo tanto, su prueba unitaria debe ejecutar cada función dos veces: una para simular una llamada preparada y otra para simular una llamada preparada para el envío. Es decir, debería tener un análisis en el que todo lo que sucede en el documento se ejecute, y otro en el que simplemente se ignore (presumiblemente se lo llame más adelante en el ciclo de vida).

EDITAR: Simplemente volvió a leer la pregunta y la entendió un poco más. Podrías simplemente anular $ (documento). Listo para hacer lo que quieras (que NO es esperar a que el evento DOMLoaded se dispare, sino que ejecute las funciones de inmediato). Este fragmento reemplazará la función $ (document) .ready con una función que hace exactamente eso. Debería ejecutarse antes de cualquier prueba unitaria. caso de prueba

var postReady = true; // or false to ignore the function calls. 
jQuery.fn.ready = function(fn) 
{ 
    if(postReady && fn) fn(); 
} 

Ejemplo:

<html><head><title>whatever</title> 
    <script type="text/javascript" src="/JS/jquery-1.3.2.js"></script> 

    <script type="text/javascript"> 
     var postReady = true; // or false to ignore the function calls. 
     jQuery.fn.ready = function(fn) 
     { 
      alert("We stole ready!"); 
      if(postReady && fn) fn(); 
     } 

     $(document).ready(function() 
     { 
      alert("The function is called."); 
     }); 
    </script> 
</head><body></body> 
</html> 
+0

@ Adam A: gracias. Intenté algo similar pero no tuve éxito. No estoy tratando de probar el documento. Ya funciona o no, sino el código que contiene. Me está costando mucho intentar invocarlo desde mi prueba unitaria. Estoy usando JsTestDriver, y no parece cargar ninguna función document.ready, independientemente de si la incluyo en una función con nombre o no. Traté de retrasarlo, window.onload, just_call_it, etc ... pero simplemente no responde. – BeraCim

+0

Probé el fragmento de código que di, y parece funcionar. Lo que hace es anular la función document.ready de jQuery, ya que el evento DOMLoaded no se activará en la prueba unitaria, lo que significa que document.ready nunca se ejecutará. El fragmento hace que document.ready sea independiente del evento DOMLoaded. Si estamos en un estado posterior al DOMLoaded (según lo determinado por la variable postReady), inmediatamente llamamos a la función que se pasó a document.ready. Si estamos en un estado pre-DOMLoaded, entonces simplemente ignore cualquier función que document.ready haya llamado (y asegúrese de que la función todavía hace lo que necesita). –

+0

@ Adam A: Intenté ejecutar con el mismo fragmento de código exacto, ejecutando la prueba de forma aislada, además de dejar solo una función document.ready en mi código (tengo varios de ellos). Desafortunadamente no pasó nada (tuve alerta en la primera línea y no apareció en absoluto). No puedo entender lo que me estoy perdiendo o lo que está mal. – BeraCim

5

Usted puede tomar las pruebas unitarias demasiado lejos, en este caso hay que preguntarse lo que está probando, y por qué. La función JQuery document.ready funciona y funciona bien (usted lo sabe porque ha sido probado por muchas personas).

Supongo que el truco sería, en lugar de crear una función anónima, nombrar una y usarla.

//So instead of this... 
$(document).ready(function() {...}); 

//Do the following 
$(document).ready(my_function); 

A continuación, sólo probar mi_funcion y asegúrese de que está trabajando. Asegúrese de probar las funciones en el orden en que serán cargadas para una prueba precisa.

Cuestiones relacionadas