2012-01-19 11 views
36

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

En mi Javascript tengo

 

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

Obviamente, tengo que burlarse window.arguments [0] en jazmín, ya que el objeto no existe si no pasa ningún parámetro de window.openDialog

este es mi intento de burlarse con "con"

 

it("should submit to server", function() { 

     var localContext = { 
      "window": { 
       arguments: ["http://localhost"] 
      } 

     } 

     with(localContext); 
 

Pero sigo teniendo este TypeError de error: no se puede leer la propiedad '0' de la indefinida, que es como cuando se realiza la prueba Windo w.arguments [0] se aniquilado con la ventana real, porque si lo hago

window.arguments[0]

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

Respuesta

52

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 al dependency injection. Es un patrón común para hacer que su unidad de código sea comprobable, con un enfoque en unidad. Qué significa. Cada vez que crea un objeto nuevo o accede a un objeto global, no solo está probando la funcionalidad de la unidad, sino también la funcionalidad de su objeto recién creado o global. Para anteceder eso, no debe crear los objetos nuevos en su unidad , sino pasarlos 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.

Por lo tanto, 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. Hacerlo de esta manera se puede pasar en el objeto ventana en su código de producción y un objeto de JavaScript simple con una argumentos atributo en su ensayo:

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

En su extensión llama a la función como esta:

youWannaTest(window); 

En su llamada prueba de la función como esta:

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

Gracias por la respuesta, por lo que no puede burlarse de eso? – toy

+0

Actualicé mi respuesta para aclarar un poco el punto. –

1

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

Sus JS:

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

pruebas unitarias:

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

Sí, puede burlarse objeto de la ventana.

Lo primero que tendrá que hacer es hacer un cambio en el código JS: Sustituir ventana con ventana $.

A continuación, puede burlarse de la ventana mediante el siguiente código:

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

ahora en su archivo de especificaciones: en beforeeach bloquear

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