una tablas tabla practico obtener examen ejemplos ejemplo datos cuestionario con agregar javascript mocking jasmine

tablas - obtener datos de una tabla html javascript



objeto de la ventana simulacro de jazmín (3)

¿Cómo me burlo del objeto ventana? Estoy haciendo la extensión de Firefox y quiero usar jazmín para las pruebas de JavaScript.

En mi javascript tengo

function submit() { ... var url = window.arguments[0]; ... }

Obviamente, tengo que simular window.arguments [0] en jazmín porque ese objeto no existe si no pasa ningún parámetro desde window.openDialog

Este es mi intento de burlarlo con "con"

it("should submit to server", function() { var localContext = { "window": { arguments: ["http://localhost"] } } with(localContext);

Pero sigo teniendo este error TypeError: no se puede leer la propiedad ''0'' de undefined, es como cuando se ejecuta la prueba window.arguments [0] se borra con la ventana real, porque si lo hago

window.arguments[0]

dentro de la prueba, imprime "http: // localhost" correctamente. pero cuando se trata del método submit () muestra el error de que window.argument no está definido.


El problema es que sobrescribe una propiedad del objeto ventana. Y si puede hacer eso, el navegador también puede hacer eso. De modo que burlarse de una función o propiedad de un objeto global al que todos pueden acceder no es una buena idea en general, porque nunca puede estar seguro de que sus cambios estarán allí cuando intente acceder a ellos.

Lo que me lleva a la inyección de dependencia . Es un patrón común para hacer que tu unidad de código sea comprobable, con un enfoque en la unidad . Qué significa. Cada vez que crea un objeto nuevo o accede a un objeto global, no solo está probando la funcionalidad de su unidad , sino también la funcionalidad de su objeto recién creado o global. Para anteceder eso, no crea los nuevos objetos en su unidad , sino que los pasa a. Normalmente harías esto en el constructor, pero como en la función de JavaScript hay objetos con el cuerpo de la función como constructor, también puedes pasar las dependencias simplemente a tu función.

Entonces, en su caso, la función depende del objeto de ventana global. Por lo tanto, en lugar de intentar acceder al objeto de ventana global, páselo como un parámetro a tu función. Al hacerlo de esta manera, puede pasar el objeto ventana en su código de producción y un objeto JavaScript simple con un atributo de argumentos en su prueba:

function youWannaTest(w){ console.log(w.arguments[0]); }

En su extensión, llame a la función de esta manera:

youWannaTest(window);

En su prueba, llame a la función de esta manera:

youWannaTest({arguments: [''someValue'']});


Sí, puedes simular el objeto ventana.

Lo primero que tendrá que hacer es hacer un cambio en su código JS: Reemplazar ventana con $ window .

Entonces, puedes simular una ventana usando el siguiente código:

var window = { arguments : [''url''] };

ahora en su archivo de especificaciones: en antesCada bloque

$controller(''controllerName'', {$window : window});


También creo que la inyección de dependencia es la solución más limpia.

Su JS:

function submit(_window) { _window = _window || window ... var url = _window.arguments[0]; ... }

Su unidad prueba:

it(''works like a dream'', function () { var _window = { arguments: [''url''] } expect(submit(_window)).toBeTotallyAwesome() })